我有以下代码序列而且我不理解编译错误(在代码下面)。
提前致谢,
尤利安
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)'
时
答案 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引用而不是普通引用。