重载运算符==抱怨'must take exactly one argument'

overloading operator== complaining of 'must take exactly one argument'

本文关键字:exactly one argument take must 重载 运算符 抱怨      更新时间:2023-10-16

我正在尝试重载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 );

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

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

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;
}

你应该把你的运算符==从有理数到其他地方。由于它是在类中声明的,因此认为"this"是第一个参数。从语义可以看出,您向编译器提供了 3 个参数。

friend bool operator==( Rationalnumber l, Rationalnumber r );

当您将其声明为非成员函数时,它可以接受两个参数。当您将其声明为成员函数时,它只能接受一个参数。