Учитывая следующий код:Как я могу предотвратить целочисленной неоднозначности при перегрузке операторов в C++
#include <string>
#include <sstream>
class SomeClass {
public:
SomeClass& operator<<(long value) { return *this; }
SomeClass& operator<<(unsigned long value) { return *this; }
SomeClass& operator<<(float value) { return *this; }
SomeClass& operator<<(double value) { return *this; }
SomeClass& operator<<(long double value) { return *this; }
SomeClass& operator<<(bool value);
{ return *this; }
SomeClass& operator<<(const void* value);
{ return *this; }
SomeClass& operator<<(::std::string aString) { return *this; }
};
int main() {
SomeClass aClass;
std::ostringstream aStream;
aClass << 2;
aClass << "Hello World";
aClass << '\0';
aClass << -2;
aStream << 2;
aStream << "Hello World";
aStream << '\0';
aStream << -2;
return 0;
}
Почему basic_ostream
способен перегружать <<
с таким количеством целочисленных типов без каких-либо проблем? Тем не менее, компилятор дает мне неоднозначные ошибки перегрузки для операторов SomeClass < <?
например:
../OverloadTest.cpp:65: error: ambiguous overload for ‘operator<<’ in ‘aClass << 2’
../OverloadTest.cpp:14: note: candidates are: SomeClass& SomeClass::operator<<(long int)
../OverloadTest.cpp:19: note: SomeClass& SomeClass::operator<<(long unsigned int)
../OverloadTest.cpp:24: note: SomeClass& SomeClass::operator<<(float)
../OverloadTest.cpp:29: note: SomeClass& SomeClass::operator<<(double)
../OverloadTest.cpp:35: note: SomeClass& SomeClass::operator<<(long double)
../OverloadTest.cpp:40: note: SomeClass& SomeClass::operator<<(bool)
../OverloadTest.cpp:46: note: SomeClass& SomeClass::operator<<(const void*)
../OverloadTest.cpp:51: note: SomeClass& SomeClass::operator<<(std::string)
У вас есть некоторые ошибки в коде, возможно, пропуская копию, 'operator <<' for 'bool' и' const void * 'конец строки в'; 'как вы, где объявляете оператор и не выполняете. – NetVipeC
Вы забыли 'int'. –