私は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]
?テンプレートクラスに+
演算子を正しく定義するにはどうすればよいですか?
"これは.hppファイルに含まれていますが、実装は別の.cppファイルに含まれています" ...試しても試していません。ヘッダーにすべてを入れる。 http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file –
「friend」宣言のテンプレートパラメータをもう一度見てください。そこに不一致があります。 –
T!= U. pick one = P – WhozCraig