实现多个操作符==时出现错误,如下:
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
对象可以隐式地转换为int
和float
,并且operator==
都存在重载。解决这个问题的一种方法是使用static_cast
消除歧义,例如:
if(static_cast<float>(myClass) == aFloat) {
...
}
现场演示
No。编译器知道它可以比较int
和float
或者float
和float
。它没有偏好
你的类提供了两者的转换,所以编译器不确定你期望哪种行为。
你需要更具体:if ((float)myClass == aFloat)