2014-08-28 4 views
1

Учитывая следующий код:Как я могу предотвратить целочисленной неоднозначности при перегрузке операторов в 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) 
+1

У вас есть некоторые ошибки в коде, возможно, пропуская копию, 'operator <<' for 'bool' и' const void * 'конец строки в'; 'как вы, где объявляете оператор и не выполняете. – NetVipeC

+3

Вы забыли 'int'. –

ответ

4

Вам нужно добавить перегрузки по крайней мере 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, компилятор не знает.