0

クラスの演算子をオーバーロードしたいと思います*.1つは実数で乗算される場合で、もう1つはdouble同じクラスタイプで乗算される場合です。

以下は私のコードです:

class Vector2D {
    ...
    friend Vector2D operator* (const Vector2D&);
    friend Vector2D operator* (const double); // getting error here
};

私が得ているエラーは次のとおりです。'Vector2D operator*(double)' must have an argument of class or enumerated type

演算子を複数回オーバーロードすることはできますか?もしそうなら、なぜエラーが発生するのですか?

4

3 に答える 3

8
class Vector2D {
    ...
    friend Vector2D operator* (const Vector2D&);

operator*これは、2 つのベクトルの乗算をオーバーロードするのではなく、フリー関数として単項(つまり、逆参照演算子) をオーバーロードすることです。非クラス型にのみ適用される演算子をオーバーロードすることはできません。これは次のエラーです。

friend Vector2D operator* (const double);

あなたはおそらく次のように書くつもりでした:

friend Vector2D operator*(const Vector2D&,const Vector2D&);
friend Vector2D operator*(const Vector2D&,double);
于 2013-07-01T22:30:35.030 に答える
5

operator*問題は、バイナリではなくunary をオーバーロードしていることです。あなたのfriend宣言はメンバー関数ではありません。

friend(演算子をメンバー関数としてオーバーロードする場合) を削除するか、 const Vector2D&or型の最初のパラメーターを追加しますVector2D&(フリー関数としてオーバーロードする場合)。両方の引数で暗黙的な変換が行われるため、通常は後者が推奨されます。メンバー演算子のオーバーロードは右側を暗黙的に変換しますが、左側は変換しません。

binary への最初の引数として参照を望まない理由は、次のoperator*ように実装できるようにするためです。

Vector2D operator*(Vector2D lhs, const Vector2D &rhs) {
    lhs *= rhs;
    return lhs;
}

同じことが足し算にも当てはまります (そして、2 つのベクトルの足し算は、2 つのベクトルの掛け算とは異なり、私には意味があります)。

于 2013-07-01T22:29:22.813 に答える
2

組み込み型の演算子をオーバーライドすることはできません。この場合、許可されていない*型の単項演算子の宣言を提供しています。double

friend宣言を削除して、代わりにこれらのメンバー関数を作成したいと思います。

于 2013-07-01T22:29:37.807 に答える