2011-11-09 18 views
0

可能性の重複使用:関数テンプレートを使用しているとき、私はコンパイラエラーを取得しています
Why can templates only be implemented in the header file?
Undefined reference to template members
c++ template and header filesnamspace内の関数テンプレートを宣言し、クラスに

をクラス。関数テンプレートは、別々のソースファイルとヘッダーファイルの名前空間で宣言されています。

ここにいくつかのコード例を示します。

namespace A header file 

namespace A { 

... 
... 
template<typename T1, typename T2 > 
bool OR(T1* j, vector<T2*>, float cut); 

... 
... 
} 

A cpp file 

namespace A { 

... 
... 
    template<typename T1, typename T2 > 
    bool OR(T1* j, vector<T2*>, float cut){ 

     .... 
     .... 

    } 

} 

は、私はそのように私が取得コンパイラエラーが(これは私の実際のコードから誤りであることに注意してくださいが、同じ考え方)は次のようであるクラス

class B cpp file (only member function) 

#include "A.h" 

void B::exmaple(){ 


    if(A::OR(m_ptrObj, m_ptrvectortoOtherObj, m_cut)){ 

     cout << "its true" << endl; 

    } 

} 

でこの名前空間を使用しています。

undefined reference to `bool JetFilters::OR<Jet, Jet>(Jet*, std::vector<Jet*, std::allocator<Jet*> >*, float) 

上記のエラーが発生する理由は何ですか?

+3

重複...いいえ、私は気にしません。 –

答えて

2

を動作するように、テンプレートの暗黙のインスタンス生成のために、テンプレートがインスタンス化の場所で見えるでなければなりません。つまり、ORを使用する場合は、関数テンプレートの定義をコンパイラに表示する必要があります。これは、ヘッダーファイルに関数テンプレートを定義することで最もよく行われます。

は、別の方法としては、明示的に製品に使用されるこれらのタイプのための A.cppファイル内 ORテンプレートをインスタンス化することができますが、編集/すべてのため A.cppを再コンパイルする必要がありますので、これは(ほとんどの場合、非常にすぐにメンテナンスの負担となります新しいタイプのテンプレートの使用

1

A.cppをコンパイルするとき、コンパイラはORのために生成する必要があるインスタンス化を認識しません。ですから、A.cppで明示的に入れたり、ヘッダファイルに、またはそれをインスタンス化するかがあります。

template bool OR<Jet,Jet>(Jet*, vector<Jet*>, float); 
関連する問題