2011-11-09 50 views
0

可能重複:
Why can templates only be implemented in the header file?
Undefined reference to template members
c++ template and header files聲明一個namspace在函數模板中使用的一類

我正在使用的函數模板時得到一個編譯器錯誤一類。函數模板在獨立的源文件和頭文件中的名稱空間中聲明。

以下是一些示例代碼。

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); 
相關問題