在 C++ 中重载运算符时如何防止整数歧义

Dan*_*urn 2 c++ overloading ambiguity operator-keyword

鉴于以下代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

为什么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) 
Run Code Online (Sandbox Code Playgroud)

Net*_*peC 6

您至少需要为int(以及为完成代码unsigned int)添加重载。

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

SomeClass& operator<<(unsigned int value) { return *this; }
Run Code Online (Sandbox Code Playgroud)

你打电话时: aClass << 2;

文字2是类型int,没有完全适合的重载,编译器需要转换数字,在转换中出现歧义。什么是更好的2longunsigned longfloatdoublelong double或甚至bool,编译器不知道。