Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 编译问题等式/不等式运算符_C++_Visual Studio_Visual C++ - Fatal编程技术网

C++ 编译问题等式/不等式运算符

C++ 编译问题等式/不等式运算符,c++,visual-studio,visual-c++,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 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版权(C)优化编译器版本15.00.30729.01 微软公司。版权所有

opequal.cpp opequal.cpp(38):错误C2678:二进制“!=”:无操作员 找到接受类型为“const X”的左t手操作数的(或有 无可接受的转换) cpp(16):可能是“boolx::operator!”=(常数X&)' 在尝试匹配参数列表(常数X,常数X)时


您需要声明您的
运算符==
运算符=用作常量

例如


您需要声明您的
运算符==
运算符=用作常量

例如


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

bool operator == (const X&r) const
将const放在成员函数的末尾可以保证函数不会修改类的任何成员(除非这些成员声明为
mutable
)。任何缺少此关键字的函数都将被假定为一个mutator,编译器将不允许在类的const实例上调用它们


您可以重载具有相同参数的函数,包括和不包括常量。在这种情况下,仅对类的const实例调用const版本。例如,STL容器重载其运算符[],以返回常量引用而不是普通引用。

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

bool operator == (const X&r) const
将const放在成员函数的末尾可以保证函数不会修改类的任何成员(除非这些成员声明为
mutable
)。任何缺少此关键字的函数都将被假定为一个mutator,编译器将不允许在类的const实例上调用它们


您可以重载具有相同参数的函数,包括和不包括常量。在这种情况下,仅对类的const实例调用const版本。例如,STL容器重载其运算符[],以返回常量引用而不是普通引用。

您正试图根据
定义
==
=
=
==
方面——在
==
的主体中,
=运算符尚未定义。您还应该将所有运算符
设置为const
。警告:最好将相等运算符声明为自由函数<代码>(X(1)=DX())(DX()==X(1))
很难保证这样。您正在尝试用
定义
=
=
=
==
方面——在
==
的主体中,
=运算符尚未定义。您还应该将所有运算符
设置为const
。警告:最好将相等运算符声明为自由函数
(X(1)=DX())(DX()==X(1))
很难保证这样。谢谢;看来我今天早上没醒来…:(谢谢你;我今天早上好像没醒来……:(谢谢你提供的细节;我真的觉得我正在经历一个艰难的早晨。谢谢你提供的细节;我真的觉得我正在经历一个艰难的早晨。