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パラメーターに対して行われるため、1 つのパラメーターのみを受け取る必要があります。

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

自由演算子 (つまり、クラスのメンバーではない) を使用する場合は、2 つの引数を指定できます。

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

メンバー演算子のオーバーロードとして、引数を 1 つだけ取り、もう 1 つは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 から別の場所に削除する必要があります。クラス内で宣言されているため、「this」が最初の引数であると見なされます。セマンティクスから、コンパイラに 3 つの引数を提供することがわかります。

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

非メンバー関数として宣言すると、2 つの引数を取ることができます。メンバー関数として宣言すると、引数を 1 つしか取ることができません。

于 2014-06-29T20:33:05.997 に答える