多个操作符重载会导致歧义调用



实现多个操作符==时出现错误,如下:

class MyClass
{
public:
    MyClass(int data, int data_b) { m_data = data;}
    operator int() { return static_cast<int> (m_data);}
    operator float() { return static_cast<float> (m_data);}
private:
    char m_data;
};
int _tmain(int argc, _TCHAR* argv[])
{
    MyClass myClass(4, 6);
    float aFloat= 5.4F;
    if(myClass == aFloat)
    {
    }
    return 0;
}

这是我得到的错误:

1>:错误C2593: 'operator =='是有歧义的1>可以是'内置c++操作符==(int, float)' 1>或'内置的c++操作符==(float, float)' 1>,同时尝试匹配参数列表'(MyClass, float)'

这是怎么回事?编译器不应该知道它应该使用float重载吗?

由于您没有显式地重载==操作符,编译器会查看您的类并尝试从中提取替代选项。它找到了它们:

1)它可以将您的类转换为int,然后比较
2)它可以将你的类转换为float,然后比较

由于两者对编译器意义相同,因此它不能决定并阻止代码编译。

你可以通过显式重载==操作符来修复它。

编辑:
许多c++开发人员忽略了一件事,那就是编译器不能对他们的代码进行2隐式转换。它只能做一件事。关于这个"隐式转换两次"的问题有很多疑问。

调用是二义性的,因为MyClass对象可以隐式地转换为intfloat,并且operator==都存在重载。解决这个问题的一种方法是使用static_cast消除歧义,例如:

if(static_cast<float>(myClass) == aFloat) {
    ...
}

现场演示

No。编译器知道它可以比较intfloat或者floatfloat。它没有偏好

你的类提供了两者的转换,所以编译器不确定你期望哪种行为。

你需要更具体:if ((float)myClass == aFloat)