C++ Как определить оператор космического корабля для класса шаблона?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 C++ Как определить оператор космического корабля для класса шаблона?

Сообщение Anonymous »

Я пытаюсь определить оператор космического корабля для простого строкового класса шаблона.
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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • C++ Как определить оператор космического корабля для класса шаблона?
    Anonymous » » в форуме C++
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • Оператор космического корабля с шаблоном варидового класса
    Anonymous » » в форуме C++
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Оператор космического корабля с шаблоном варидового класса
    Anonymous » » в форуме C++
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Как именно оператор космического корабля PHP сравнивает строки, массивы и объекты
    Anonymous » » в форуме Php
    0 Ответы
    27 Просмотры
    Последнее сообщение Anonymous
  • Как использовать оператор космического корабля в операторе переключения
    Anonymous » » в форуме C++
    0 Ответы
    34 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»