11

我试图重载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 );

有谁知道为什么会抛出错误?

4

4 回答 4

21

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

class Foo {
  bool operator==(const Foo& rhs) const { return true;}
};

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

class Bar { };
bool operator==(const Bar& lhs, const Bar& rhs) { return true;}
于 2012-06-27T14:58:34.693 回答
4

作为成员运算符重载,它应该只接受一个参数,另一个是this.

class Foo
{
    int a;

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

//...

bool Foo::operator==(const Foo & foo)
{
    return a == foo.a;
}
于 2012-06-27T15:00:04.683 回答
2

您应该将您的 operator== 从 RationalNumber 删除到其他地方。因为它是在一个类中声明的,所以它被认为是第一个参数。从语义上可以看出,您向编译器提供了 3 个参数。

于 2012-06-27T14:58:01.900 回答
1
friend bool operator==( Rationalnumber l, Rationalnumber r );

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

于 2014-06-29T20:33:05.997 回答