在命名空间中声明函数模板并在类中使用

时间:2011-11-09 18:01:26

标签: c++

  

可能重复:
  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)

为什么我收到上述错误的任何想法?

2 个答案:

答案 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);