1

私が行っているプロジェクトで == 演算子をオーバーロードしようとしています。宣言と定義は次のとおりです。

friend bool operator==(const TradeItem& item);

bool TradeItem::operator==(const TradeItem& item)

これをコンパイルすると、「bool operator==(const TradeItem&)」は正確に 2 つの引数を取る必要があります。だから私はそれを次のような2つの引数を持つように作り直しました:

friend bool operator==(const TradeItem& i1, TradeItem& i2);

bool TradeItem::operator==(const TradeItem& i1, TradeItem& i2)

しかし、これをコンパイルすると、引数が1つだけ必要であることがわかります....回避策を教えてください。誰が何がうまくいかないのか知っていますか?

4

4 に答える 4

6

問題はそれです:

friend bool operator==(const TradeItem& item);

次の 2 つの引数が必要です。

bool TradeItem::operator==(const TradeItem& item)

1 つの引数が必要です。

これは、の非メンバー バージョンにはoperator==常に 2 つ必要であり、メンバー バージョンには 1 つ必要であるためです。フレンド宣言で、非メンバー演算子のオーバーロードが宣言されています。

class C {
    friend bool operator==(const C &lhs, const C &rhs);
public:
    bool operator==(const C& rhs);
};

bool operator==(const C &lhs, const C &rhs) { return true; }

bool C::operator==(const C& rhs) { return true; }

また、左側で型変換を許可する必要がある場合にのみ、2 メンバー バージョンを使用する必要があります。例えば:

bool operator==(int lhs, const C &rhs);
bool operator==(double lhs, const C &rhs);

10 == C();
3.0 == C();

そして、これらのオーバーロードを C のフレンドとして宣言しなくても済む場合があります。次のようなものかもしれません。

class C {
public:
    bool operator==(const C& rhs);
    bool operator==(int rhs);
    bool operator==(double rhs);
};

bool operator==(int lhs, const C &rhs) { return rhs == lhs; }
bool operator==(double lhs, const C &rhs) { return rhs == lhs; }

bool C::operator==(const C& rhs) { return true; }
bool C::operator==(int rhs) { return *this == convert_int_to_C(rhs); }
bool C::operator==(double rhs) { return *this == convert_double_to_C(rhs); }

また、等価性をチェックしてもオブジェクトは変更されないためconst、メンバー関数を修飾する必要があります。

class C {
    bool operator== (C const &rhs) const;
}
于 2013-03-10T01:51:21.917 に答える
3

==二項演算子であることを思い出してください。これは、常に2 つの引数が必要であることを意味します。メンバー関数としてオーバーロードする場合operator==()、これらの引数の 1 つは暗黙的thisであり、すべてのメンバー関数に渡されます。

コードで、クラスoperator==()の であるグローバル関数を宣言します。同時に、をのメンバーとして定義します。一つを選ぶ; 両方を行うべきではありません。friendTradeItemoperator==()TradeItem

于 2013-03-10T01:51:00.133 に答える
0

operator のクラス メンバー バージョン==は 1 つの引数を取り、フレンド バージョンは 2 つの引数を取るので、次のようになります。

friend bool operator==(const TradeItem& i1, TradeItem& i2);

bool TradeItem::operator==(const TradeItem& i )    

これは、メンバ バージョンに隠しthis引数があるためです。また、メンバー版はフレンド版よりも優先されます。どちらかを選択する必要があります。

于 2013-03-10T01:51:02.523 に答える
0

2 つの引数を取る operator== オーバーロードは、メンバー関数であってはなりません - として宣言してbool operator==(const T&, const T&)ください。

于 2013-03-10T01:51:04.590 に答える