2012-03-08 14 views
1

私はクラスVector<T>を持ち、クラスYAML::Nodeを提供するライブラリを使用しています。私はこれら2つのタイプのためにoperator>>をオーバーロードしたいと思います。operator >> overloadの明示的なインスタンス化

私はVectorの宣言に次の宣言を追加しました:私は、関数の次の実装をも追加した

friend void operator>>(YAML::Node const & node, Vector<T> & v); 

template<typename T> 
void operator>>(YAML::Node const & node, Vector<T> & v) { 
    node[0] >> v.x; 
    node[1] >> v.y; 
    node[2] >> v.z; 
} 

最後に、私は以下の(試みを追加しましたat)テンプレートを明示的にインスタンス化するT = num_t

template 
void operator>>(YAML::Node const & node, Vector<num_t> & v); 

しかし、これは次のリンカエラーが発生:

Error 9 error LNK2019: unresolved external symbol "void __cdecl operator>>(class YAML::Node const &,class Vector<double> &)" ([email protected]@[email protected]@[email protected]@@@Z) referenced in function "public: static class Scene __cdecl Scene::fromFile(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" ([email protected]@@[email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@@Z) 

しかし、私は関数の実装を、以下の(非テンプレート)を追加した場合、すべてのコンパイル(num_tdoubleのtypedefです)罰金:

void operator>>(YAML::Node const & node, Vector<num_t> & v) { 
    node[0] >> v.x; 
    node[1] >> v.y; 
    node[2] >> v.z; 
} 

なぜ機能のテンプレートバージョンは機能しませんか?

編集:忘れないでください;コンパイラはVisual Studio 11 Beta

答えて

3

friendとして関数を宣言しますか?ではありません。関数テンプレートを宣言します。代わりに、クラステンプレートの各特殊化は、非テンプレート関数を宣言し、そのパラメータ型はテンプレート引数に従ってオーバーロードされます。これらは、定義したテンプレートの代わりに選択されます。しかし、それらは定義されていないので、エラーです。

修正するには、クラステンプレートの前に関数テンプレートを宣言します(この場合、フレンド宣言は新しい関数を宣言するのではなくフレンドにする)か、クラス内でフレンド関数をインラインで定義しますクラステンプレートの各特殊化がそれを宣言するだけでなく、関数を定義するようにする。

+0

ありがとうございました。 –

0

これは奇妙です。私は間違ったことは何も見えないし、MSDNのドキュメント(これはVisual C++の権利ですか?)でもテンプレートのインスタンス化がテンプレートの引数を推論することを確認します。インスタンス化の引数が一致します。オーバーロードされた演算子のために壊れている可能性がありますか?

テンプレート引数を明示的に追加しても問題ありません。

また、typedefによって混乱している可能性がありますか?あなたは、決して知らない!ダブルを代用してみてください。

2

あなたが宣言したfriendは、テンプレートではない関数であり、シフト演算子では何もしません。実際、あなたのテンプレートは、コンパイラが文句を言うべきプライベートメンバーを使用します。あなたは

friend void f(foo<T>); 

でfriend宣言を交換した場合、このコードは、いずれかのリンクはありませんし、実際にその機能を示すコンパイル時エラーが発生します

template <typename T> 
class foo 
{ 
public: 
    template <typename S> 
    friend void f(foo<S>); 

private: 
    T value; 
}; 

template <typename T> 
void f(foo<T> v) 
{ 
    v.value; 
} 
template void f(foo<int>); 

int main() 
{ 
    foo<int> v; 
    f(v); 
} 

:ここでは、このように見えるべきかの例でありますf()は友達ではありません。

関連する問題