编译问题相等/不相等操作符

Compilation issue equality/inequality operators

本文关键字:不相等 操作符 问题 编译      更新时间:2023-10-16

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

提前感谢,

Iulian

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:Projectscpptests>cl opequal.cpp Microsoft (R) 32位C/c++优化编译器Version 15.00.30729.01 for 80x86微软公司。版权所有

opequal.cpp opequal.cpp(38): error C2678: binary '!=':无操作符find的左操作数类型为'const X'(或者存在)不接受转换)opequal.cpp(16):可以是bool X::operator !=(const X &)当尝试匹配参数列表'(const X, const X)'

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

bool operator == (const X&r) const

你的操作符函数声明应该是这样的

bool operator == (const X&r) const

将const放在成员函数的末尾,保证该函数不修改类的任何成员(除非这些成员声明为mutable)。任何缺少此关键字的函数都被认为是一个mutator,编译器不允许在该类的const实例上调用它们。

可以用相同的实参重载函数,无论是否带const。在这种情况下,只能在类的const实例上调用const版本。例如,STL容器重载其操作符[]以返回const引用而不是普通引用。