可能重复:
Why can templates only be implemented in the header file?
Undefined reference to template members
c++ template and header files
在类中使用函数模板时出现编译器错误。函数模板在单独的源和头文件中的命名空间中声明。
以下是一些示例代码。
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)
为什么我收到上述错误的任何想法?
答案 0 :(得分:2)
要使模板的隐式实例化起作用,模板必须在实例化位置可见。也就是说,当您使用OR
时,编译器必须看到函数模板定义。这通常是通过在头文件中定义函数模板来实现的。
或者,您可以在OR
文件中显式实例化A.cpp
模板中那些将在产品中使用的类型,但在大多数情况下这很快就会成为维护负担(因为您将拥有编辑/重新编译A.cpp
,以便每次使用新类型的模板时使用
答案 1 :(得分:1)
编译A.cpp时,编译器不知道必须为OR生成哪些实例。因此,您必须将OR放入头文件或在A.cpp中明确地实例化它:
template bool OR<Jet,Jet>(Jet*, vector<Jet*>, float);