0

私は Vector2D クラスに取り組んでいます。ベクトル加算とスカラー加算の両方を +=/+ 演算子で実装するのは理にかなっていると思います。

問題は、この明らかな引数のあいまいさを回避する方法が本当にわからないことです.Clangは次のように言っています:

vector2d_test.cpp:17:16: error: use of overloaded operator
      '+=' is ambiguous (with operand types 'Vector2D<float>' and 'int')
        vector += 1;
        ~~~~~~ ^  ~~~~~~~
vector2d.hpp:34:18: note: candidate function
    Vector2D<T>& operator+=(const Vector2D<T>& other)
                 ^
vector2d.hpp:41:18: note: candidate function
    Vector2D<T>& operator+=(const T summand) const

以下に 2 つの関数を示します。

Vector2D<T>& operator+=(const Vector2D<T>& other)
{
    x += other.x;
    y += other.y;
    return *this;
}

template <typename S>
Vector2D<T>& operator+=(const S summand) const
{
    x += summand;
    y += summand;
    return *this;
}

それで...これについて私ができることはありますか?

4

3 に答える 3

2

あなたはすべてあなたにエラーメッセージを書いています。int型のベクトル変数に追加しようとしましたが、ベクトルにfloatがあります。そのはず:

vector += 1f;

また

vector += 1.0;

見てください。このベクトルがある場合:

Vector2D<float> vector;

このベクトルに対応する関数にはヘッダーがあります。

Vector2D<T>& operator+=(const float summand) const;

2つ目は今は関係ありません。そして、ベクトル1に追加しようとすると、関数を呼び出そうとします。

Vector2D<T>& operator+=(const int summand) const;

あなたが宣言しなかったもの。そのため、コンパイラはエラーを通知します。適切な関数が見つかりません。

于 2013-03-15T09:38:10.247 に答える
1

あなたが何をしようとしているのかは明らかではありません。あなたが投稿したoperator+= 関数は、メンバーでない限り合法ではありません。そして、彼らがメンバーであり、次のようなものがある場合:

Vector2D<float> v;
//   ...
v += 1;

関数は呼び出し可能ではないため、Vector2D<float>::operator+=( Vector2D<float> const& ) あいまいさはありません。関数がメンバーでない場合は、次のように記述する必要があります。

template <typename T>
Vector2D<T>& operator+=( Vector2D<T>& lhs, Vector2D<T> const& rhs );
template <typename T, typename U>
Vector2D<T>& operator+=( Vector2D<T>& lhs, U rhs );

この場合でも、最初はrhsof 型intで呼び出すことができないため、あいまいさはありません。

編集:

constあなたの投稿の 2 番目の最後のを見逃しました。これは明らかなタイプミスです。暗黙の変換も行わ ない限りVector2D、何も変更されません(これはおそらく良い考えではありません)。それ以外の場合、最初のバージョンはまだ呼び出し可能ではありません。たとえば、 からintへの暗黙的な変換があり、const 以外の Vector2DVector2Dを呼び出す 場合、最初のオーバーロードは暗黙的な最初の引数 (ポインターになります) と完全に一致するため、より適切に一致します。 、 cv 変換さえしなくても、テンプレートのインスタンス化が完全に一致するため、2 番目の関数の方が 2 番目の引数により適しています。したがって、呼び出しはあいまいです。+=this

于 2013-03-15T09:56:45.627 に答える
0

最も簡単な方法は、Vector2D ala 内で関数を定義することです。

Vector2D& operator+=(const Vector2D& rhs)
    { ...each this element += rhs's corresponding element... }

Vector2D& operator+=(const T& summand)
    { ...each this elements += summand... }

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

friend Vector2D operator+(Vector2D lhs, const T& rhs) { return lhs += rhs; }

ノート:

  • 非メンバー関数はfriends であり、インラインで便利に定義できます
  • 関数はすべきではありませんconst(1つはあなたの質問にありました)
  • 通常の変換が試行されるため、変換の選択があいまいになる単一の暗黙のコンストラクターを与えるなどの面白いことをしない限り、 Tis floatthen s は正常に機能しますintVector2Dint
于 2013-03-15T09:51:40.593 に答える