2012-05-02 20 views
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:ERROR:「VEC2 VEC2 ::演算子*を( v_float &、vec2 &) 'は0または1つの引数をとる必要がありますオーバーロードテンプレート演算子*

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

+0

事業者のためのパラメータの数は、それらがメンバー機能として実装した場合に、1以下です。 – trutheality

答えて

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つの引数、つまり乗算の右辺を取る関数を定義するだけでよいことを意味します(左辺は受信者オブジェクトになるため)。

私はあなたがここに示したように、フリー機能としてこれを持っているためのものだと思い

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); 
} 

・ホープ、このことができます!

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); 
}