我在实现多个operator ==时遇到错误:
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&gt;:错误C2593:'operator =='不明确1&gt;可能 '内置C ++运算符==(int,float)'1&gt;或'内置 C ++ operator ==(float,float)'1&gt;而试图匹配 参数列表'(MyClass,float)'
这里发生了什么?不应该编译出来应该使用浮动过载吗?
答案 0 :(得分:3)
由于您没有显式重载==
运算符,编译器会查看您的类并尝试从中提取替代项。它发现了它们:
1)它可以将您的班级转换为int
,然后进行比较
2)它可以将您的班级转换为float
,然后比较左
因为两者对编译器都有同样的意义,所以它不能决定并阻止代码编译。
您可以通过明确重载==
运算符来修复它。
编辑:
许多C ++开发人员遗漏的一件事是编译器无法对其代码进行 2 隐式转换。它只能做一个。关于这个&#34;隐式转换两次&#34;有一些值得注意的问题。问题
答案 1 :(得分:0)
调用不明确,因为MyClass
对象可以隐式转换为int
和float
,并且operator==
存在两个重载。解决此问题的一种方法是使用static_cast
消除歧义,例如:
if(static_cast<float>(myClass) == aFloat) {
...
}
答案 2 :(得分:0)
没有。编译器知道它可以比较int
和float
或float
和float
。它并没有偏好。
您的类为两者提供转换,因此编译器无法确定您期望的行为。
您需要更加具体:if ((float)myClass == aFloat)