编译问题平等/不等式运算符

时间:2011-10-14 07:16:38

标签: c++ visual-studio visual-c++

我有以下代码序列而且我不理解编译错误(在代码下面)。

提前致谢,

尤利安

class X {
public:

    int a;

    X()
    {
        a = 0;
    }

    bool operator == (const X&r)
    {
        return  a == r.a;
    }

    bool operator != (const X&r)
    {
        return !( *this == r );
    }
};

class DX : public X
{
public:
    int dx;
    DX()
    {
        dx = 1;
    }

    bool operator == (const DX&r)
    {

        if( dx != r.dx ) return false;
        const X * lhs = this;
        const X * rhs = &r;

        if ( *lhs != *rhs ) return false;

        return true;
    }

    bool operator != (const DX&r)
    {
        return !( *this == r );
    }
};

int main(void)
{
    DX d1;
    DX d2;
    d1 == d2;
    return 0;
}

错误:

  

d:\ Projects \ cpptests> cl opequal.cpp Microsoft(R)32位C / C ++   针对80x86优化编译器版本15.00.30729.01版权所有(C)   微软公司。保留所有权利。

     

opequal.cpp opequal.cpp(38):错误C2678:二进制'!=':无运算符   发现它采用'const X'类型的lef t-hand操作数(或者有   无可接受的转换)           opequal.cpp(16):可能是'bool X :: operator!=(const X&)'           在尝试匹配参数列表'(const X,const X)'

2 个答案:

答案 0 :(得分:4)

您需要将operator==operator!=函数声明为const。

例如

bool operator == (const X&r) const

答案 1 :(得分:1)

您的运算符函数声明应该如下所示

bool operator == (const X&r) const

将const放在成员函数的末尾,承诺该函数不会修改该类的任何成员(除非这些成员被声明为mutable)。任何缺少此关键字的函数都将被假定为mutator,并且编译器不允许在类的const实例上调用它们。

使用和不使用const可以使用相同的参数重载函数。在这种情况下,const版本只会在类的const实例上调用。例如,STL容器重载其operator []以返回const引用而不是普通引用。