2011-11-09 52 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); 
相关问题