Я пытаюсь определить оператор космического корабля для простого строкового класса шаблона.
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++
Программы на C++. Форум разработчиков
1732821569
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;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79232814/c-how-to-define-the-spaceship-operator-for-a-template-class[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия