Как я могу предотвратить целочисленную неоднозначность при перегрузке операторов в Stack Overflow

Учитывая следующий код:

#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)

1

Решение

Вам нужно добавить перегрузку хотя бы для int (и для завершения кода для unsigned int тоже).

SomeClass& operator<<(int value) { return *this; }

SomeClass& operator<<(unsigned int value) { return *this; }

Когда вы звоните: aClass << 2;

буквальный 2 имеет тип int, там не перегрузка, которая подходит точно, компилятор должен преобразовать число, в преобразовании, где появляется неоднозначность. Что лучше для 2, long или же unsigned long или же float или же double или же long double или даже boolКомпилятор не знает.

4

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector