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))
很难保证这样。谢谢;看来我今天早上没醒来…:(谢谢你;我今天早上好像没醒来……:(谢谢你提供的细节;我真的觉得我正在经历一个艰难的早晨。谢谢你提供的细节;我真的觉得我正在经历一个艰难的早晨。