重载运算符==抱怨'必须采取一个参数'

chl*_*ong 9 c++

我试图重载operator==,但编译器抛出以下错误:

‘bool Rationalnumber::operator==(Rationalnumber, Rationalnumber)’ must take exactly one argument
Run Code Online (Sandbox Code Playgroud)

我的一小段代码如下:

bool Rationalnumber::operator==(Rationalnumber l, Rationalnumber r) {
  return l.numerator() * r.denominator() == l.denominator() * r.numerator();
}
Run Code Online (Sandbox Code Playgroud)

宣言:

bool operator==( Rationalnumber l, Rationalnumber r );
Run Code Online (Sandbox Code Playgroud)

有没有人有任何想法,为什么它会抛出错误?

jua*_*nza 18

如果operator==是非静态数据成员,则应该只接受一个参数,因为比较将是隐式this参数:

class Foo {
  bool operator==(const Foo& rhs) const { return true;}
};
Run Code Online (Sandbox Code Playgroud)

如果要使用自由运算符(即不是类的成员),则可以指定两个参数:

class Bar { };
bool operator==(const Bar& lhs, const Bar& rhs) { return true;}
Run Code Online (Sandbox Code Playgroud)


小智 2

您应该将 RationalNumber 中的运算符 == 删除到其他地方。由于它是在类内部声明的,因此认为“this”是第一个参数。从语义上可以看出,您向编译器提供了 3 个参数。