C++ 重载运算符==抱怨';必须只接受一个参数';

C++ 重载运算符==抱怨';必须只接受一个参数';,c++,C++,我试图重载运算符==,但编译器抛出以下错误: ‘bool Rationalnumber::operator==(Rationalnumber, Rationalnumber)’ must take exactly one argument 我的简短代码如下: bool Rationalnumber::operator==(Rationalnumber l, Rationalnumber r) { return l.numerator() * r.denominator() == l.den

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

‘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 );

有人知道它为什么会抛出错误吗?

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

如果
运算符==
是非静态数据成员,则is应该只接受一个参数,因为与隐式
参数进行比较:

class Foo {
  bool operator==(const Foo& rhs) const { return true;}
};
如果要使用自由运算符(即不是类的成员),则可以指定两个参数:

class Bar { };
bool operator==(const Bar& lhs, const Bar& rhs) { return true;}
作为成员运算符重载,它应该只接受一个参数,另一个参数是
this

class Foo
{
    int a;

public:
    bool operator==(const Foo & foo);
};

//...

bool Foo::operator==(const Foo & foo)
{
    return a == foo.a;
}
当您将其声明为非成员函数时,它可以接受两个参数。
当您将其声明为成员函数时,它只能接受一个参数。

这可能会有所帮助:。既然你是会员,它的左边已经通过隐藏的
这个
参数隐式进入。您必须用一个参数定义成员函数,或者用两个参数定义文件作用域函数。它是成员函数还是独立函数?我认为
RationalNumber::operator=
部分非常清楚地解释了它是哪一个是。@juanchopanza:如果类型支持隐式转换,则非成员是更好的选择。成员将允许
num==0
,但不允许
0==num
,而非成员将允许两者。
friend bool operator==( Rationalnumber l, Rationalnumber r );