1

私はC++にかなり慣れておらず、クラスの<演算子をオーバーロードしようとしています。

私のヘッダーファイルには次のものがあります。

friend bool operator<(const Tweet& a, const Tweet& b);

そして私が持っているクラスファイルには:

inline bool Tweet::operator<(const Tweet& a, const Tweet& b) {
    return (a.getID() < b.getID());
}

現在、エラーが発生しています‘bool Tweet::operator<(const Tweet&, const Tweet&)’ must take exactly one argument

変更を削除Tweet::すると、エラーが未定義の参照に変更され、2番目の引数を削除すると、エラーが「正確に2つの引数を取る必要があります」に変更されます。

PS-演算子のオーバーロードの適切なセクションといくつかの関連する質問に従おうとしましたが、さまざまなエラーが発生します。

4

1 に答える 1

1

さて、あなたは自立関数を友達として宣言し、次にクラスメンバー関数を比較として定義しています。それは正確には正しくありません。

2つの引数を持つ比較演算子を定義する場合は、静的に宣言する必要があります。

static bool Tweet::operator<(const Tweet& a, const Tweet& b) {
    return (a.getID() < b.getID());
}

このようa < bに解釈されTweet::operator<(a, b);ます。

がないとstatic、暗黙的に3つの引数が得られます:*this、、。ab

または、インスタンス演算子を定義して、1つの引数を取り、それを現在のインスタンスと比較することもできます。

bool Tweet::operator<(const Tweet& b) {
    return (getID() < b.getID());
}

このようa < bに解釈されa.operator<(b);ます。

または、独立した関数を定義することもできます(これは実際に必要になる可能性がある場所ですfriend)。

bool operator<(const Tweet& a, const Tweet& b) {
    return (a.getID() < b.getID());
}

このようa < bに解釈されoperator<(a, b);ます。

どちらの方法も良いです。

于 2012-08-19T20:49:26.940 に答える