1
// vec2.h
template<class v_float=float>
class vec2
{
public:
    v_float m[2];
};

template<class v_float>
vec2<v_float> operator* (v_float & f, vec2<v_float> & v);

template<class v_float>
vec2<v_float> vec2<v_float>::operator* (v_float & f, vec2 & v)
{
    return vec2(v.m[0]*f, v.m[1]*f);
}

上記のテンプレートクラスvec2の演算子*をオーバーロードしたいのですが、上記のコードで次のエラーが発生しました:vec2.cpp:68:エラー:'vec2 vec2 :: operator *(v_float&、vec2&)'はゼロまたは1つの引数

テンプレートクラスの演算子*(float、vec2)をオーバーロードする方法は?operator*のパラメーターの数は2でなければならないことに注意してください。

4

2 に答える 2

2

問題はこのテンプレートメンバー関数にあると思います:

template<class v_float>
    vec2<v_float> vec2<v_float>::operator* (v_float & f, vec2 & v)
{
    return vec2(v.m[0]*f, v.m[1]*f);
}

ここではメンバー関数として定義operator *しているため、C++ はレシーバー オブジェクトがオペランドの 1 つであると自動的に想定します。つまり、乗算を定義する場合は、1 つの引数、つまり乗算の右辺を取る関数のみを定義する必要があります (左辺が受信側オブジェクトになるため)。

ここに示すように、これを無料の機能として使用するつもりだったと思います。

template<class v_float>
    vec2<v_float> operator* (v_float & f, vec2<v_float> & v)
{
    return vec2(v.m[0]*f, v.m[1]*f);
}

お役に立てれば!

于 2012-05-02T00:17:16.000 に答える
0

宣言されておらず、オーバーロードされていない * メンバー関数と非メンバー関数でコンストラクターを使用しました。ベスト プラクティスは、通常、メンバー以外のフレンド関数を使用することです。

このようなもの:

template<typename v_float=float>
class vec2
{
    v_float m[2];

public:
    vec2(const v_float &f1, const v_float &f2) { m[0] = f1; m[1] = f2; }

    template<typename T, typename Y>
    friend vec2<Y> operator*(T f, const vec2<Y> & v);
};

template <typename T, typename v_float>
vec2<v_float> operator*(T f, const vec2<v_float> & v)
{
    return vec2<v_float>(v.m[0]*f, v.m[1]*f);
}
于 2012-05-02T02:00:40.743 に答える