多个运算符重载导致调用模糊

时间:2015-10-13 14:35:56

标签: c++

我在实现多个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)'

这里发生了什么?不应该编译出来应该使用浮动过载吗?

3 个答案:

答案 0 :(得分:3)

由于您没有显式重载==运算符,编译器会查看您的类并尝试从中提取替代项。它发现了它们:

1)它可以将您的班级转换为int,然后进行比较 2)它可以将您的班级转换为float,然后比较左

因为两者对编译器都有同样的意义,所以它不能决定并阻止代码编译。

您可以通过明确重载==运算符来修复它。

编辑:
许多C ++开发人员遗漏的一件事是编译器无法对其代码进行 2 隐式转换。它只能做一个。关于这个&#34;隐式转换两次&#34;有一些值得注意的问题。问题

答案 1 :(得分:0)

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

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

Live demo

答案 2 :(得分:0)

没有。编译器知道它可以比较intfloatfloatfloat。它并没有偏好。

您的类为两者提供转换,因此编译器无法确定您期望的行为。

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