Я пытаюсь определить оператор космического корабля для простого строкового класса шаблона.
namespace mylib
{
template
struct String
{
String()
{
*data = '\0';
}
String(const char *str)
{
size_t l = strlen(str);
if (l >= N)
throw std::runtime_error(str);
memcpy(data, str, l + 1);
}
auto operator(const String& str) const
{
return data str.data;
}
char data[N];
};
}
void test_string()
{
mylib::String str1;
mylib::String str2("Hallo");
mylib::String str3 = "Hallo";
mylib::String str4 = "hallo";
assert(str2 == str3);
assert(str4 != str2);
assert(str2 < str4);
assert(str2 str2);
assert(str4 >= str2);
mylib::String str5 = "Hallo";
}
Но я получаю некоторые ошибки.
1>E:\Projects\Windows\ind\IndDlg.cpp(104,2): error C2678: binary '==': no operator found which takes a left-hand operand of type 'mylib::String' (or there is no acceptable conversion)
1> 'bool operator ==(const D2D1_SIZE_U &,const D2D1_SIZE_U &)': cannot convert argument 1 from 'mylib::String' to 'const D2D1_SIZE_U &'
Как определить оператор космического корабля для класса шаблона?
Он должен иметь возможность сравнивать строки разного размера:
String < String
Например.
Я использую Visual Studio 2022 C++ 20.
Спасибо за все комментарии!
Вот новый код, включающий все включения и
оператор сравнения шаблонов.
// String.cpp
#include
#include
#include
namespace mylib
{
template
struct String
{
String()
{
*data = '\0';
}
String(const char* str)
{
size_t l = strlen(str);
if (l >= N)
throw std::runtime_error(str);
memcpy(data, str, l + 1);
}
template
auto operator(const String& str)
{
return strcmp(data, str.data);
}
template
bool operator==(const String& str) const
{
return operator(str) == 0;
}
char data[N];
};
} // namespace mylib
int main()
{
mylib::String str1;
mylib::String str2("Hallo");
mylib::String str3 = "Hallo";
mylib::String str4 = "hallo";
assert(str2 == str3);
assert(str4 != str2);
assert(str2 < str4);
assert(str2 str2);
assert(str4 >= str2);
mylib::String str5 = "Hallo";
return 0;
}
Теперь я получаю следующую ошибку 4 раза:
1>E:\Projects\WindowsTest\String\String.cpp(53,2): error C2666: 'mylib::String::operator ': overloaded functions have similar conversions
1> E:\Projects\WindowsTest\String\String.cpp(29,8):
1> could be 'auto mylib::String::operator (const mylib::String &)' [rewritten expression '0 < (x y)']
1> E:\Projects\WindowsTest\String\String.cpp(29,8):
1> or 'auto mylib::String::operator (const mylib::String &)' [synthesized expression '(y x) < 0']
1> E:\Projects\WindowsTest\String\String.cpp(53,2):
1> while trying to match the argument list '(mylib::String, mylib::String)'
Что я делаю не так?
Теперь я изменил данные с символьного типа на массив, но все равно получаю те же ошибки, что и раньше.
// String.cpp
#include
#include
#include
#include
namespace mylib
{
// This class is for short constant strings on the stack without any overhead.
template
struct String
{
String()
{
*data = '\0';
}
String(const char* str)
{
size_t l = strlen(str);
if (l >= N)
throw std::runtime_error(str);
memcpy(data, str, l + 1);
}
template
auto operator(const String& str)
{
return data str.data;
}
template
bool operator==(const String& str) const
{
return (data str.data) == 0;
}
std::array data;
};
} // namespace mylib
int main()
{
mylib::String str1;
mylib::String str2("Hallo");
mylib::String str3 = "Hallo";
mylib::String str4 = "hallo";
assert(str2 == str3);
assert(str4 != str2);
assert(str2 < str4);
assert(str2 str2);
assert(str4 >= str2);
mylib::String str5 = "Hallo";
return 0;
}
Подробнее здесь: https://stackoverflow.com/questions/792 ... late-class
C++ Как определить оператор космического корабля для класса шаблона? ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как именно оператор космического корабля PHP сравнивает строки, массивы и объекты
Anonymous » » в форуме Php - 0 Ответы
- 27 Просмотры
-
Последнее сообщение Anonymous
-