2013-01-14 9 views
5

私はC++でVector2クラスをテンプレートとして作成していますが、単純に2つのベクトルを追加できるメンバー以外のフレンド関数として+演算子を定義したいとします。 このコードは何を行い、なぜコンパイルするのですか?

この

は私のベクトル2のテンプレートクラス内のfriend宣言です:

template <class U> 
friend Vector2<T> operator+(const Vector2<T> &lhs, const Vector2<T> &rhs); 

これは.hppファイルに含まれているが、実装は、別.cppファイルである:これはなしでコンパイル

template <class T> 
Vector2<T> operator+(const Vector2<T> &lhs, const Vector2<T> &rhs) 
{ 
    return Vector2<T>(lhs.x_ + rhs.x_, lhs.y_ + rhs.y_); 
} 

どんな警告も、しかし、それは動作していないようです。私は上記のスニペットをコンパイルしようとする

Vector2<int> v1(4, 3); 
Vector2<int> v2(3, 4); 

Vector2<int> v3 = v1 + v2; 

、GCCは文句を言う:私は間違って何をやっている

prog.cpp: In function ‘int main(int, char**)’: 
prog.cpp:26:28: error: no match for ‘operator+’ in ‘v1 + v2’ 

source/vector2.hpp:31:23: note: template<class U> Vector2<int> operator+(const Vector2<int>&, const Vector2<int>&) 
source/vector2.hpp:31:23: note: template argument deduction/substitution failed: 
prog.cpp:26:28: note: couldn't deduce template parameter ‘U’ 
prog.cpp:26:18: warning: unused variable ‘v3’ [-Wunused-variable] 

?テンプレートクラスに+演算子を正しく定義するにはどうすればよいですか?

+7

"これは.hppファイルに含まれていますが、実装は別の.cppファイルに含まれています" ...試しても試していません。ヘッダーにすべてを入れる。 http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file –

+2

「friend」宣言のテンプレートパラメータをもう一度見てください。そこに不一致があります。 –

+0

T!= U. pick one = P – WhozCraig

答えて

3

オペレータのテンプレートには、使用されていないパラメータUが使用されています。 Uが使用されていない、コンパイラが自動的にそれがどうあるべきかのタイプを推測し、エラーを与えることができないので

template <class U> 
friend Vector2<T> operator+(const Vector2<T> &lhs, const Vector2<T> &rhs); 

:署名は、おそらく、周囲のクラステンプレートから来ていること、代わりにTを使用しています。

テンプレートパラメータを一貫して使用し、テンプレートの定義を.hppファイルに入れてください。これで問題はありません。

5

コンパイラは、問題の内容を明確に述べています。テンプレートパラメータ 'U'を推論することはできません。 宣言(.hppファイル)が間違っています。

template <class T> 
friend Vector2<T> operator+(const Vector2<T> &lhs, const Vector2<T> &rhs); 
+0

source/vector2.hpp:30:15:error: 'class T'の宣言 ソース/ベクター2.hpp:12:10:エラー:シャドウテンプレートparm 'class T' – corazza

関連する問題