我试图重载operator==
,但编译器抛出以下错误:
‘bool Rationalnumber::operator==(Rationalnumber, Rationalnumber)’ must take exactly one argument
我的简短代码如下:
bool Rationalnumber::operator==(Rationalnumber l, Rationalnumber r) {
return l.numerator() * r.denominator() == l.denominator() * r.numerator();
}
声明:
bool operator==( Rationalnumber l, Rationalnumber r );
有没有人有任何想法为什么会抛出错误?
答案 0 :(得分:16)
如果operator==
是非静态数据成员,则应该只接受一个参数,因为比较将是隐式this
参数:
class Foo {
bool operator==(const Foo& rhs) const { return true;}
};
如果要使用自由运算符(即不是类的成员),则可以指定两个参数:
class Bar { };
bool operator==(const Bar& lhs, const Bar& rhs) { return true;}
答案 1 :(得分:3)
作为 成员 运算符重载,它应该只接受一个参数,另一个是this
。
class Foo
{
int a;
public:
bool operator==(const Foo & foo);
};
//...
bool Foo::operator==(const Foo & foo)
{
return a == foo.a;
}
答案 2 :(得分:2)
您应该将您的运算符==从RationalNumber移除到其他地方。 当它在类中声明时,它被认为是'this'是第一个参数。从语义上看,你可以为编译器提供3个参数。
答案 3 :(得分:0)
friend bool operator==( Rationalnumber l, Rationalnumber r );
当您将其声明为非成员函数时,它可以采用两个参数。 当你将它声明为成员函数时,它只能接受一个参数。