Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在namspace中声明函数模板并在类中使用_C++ - Fatal编程技术网

C++ 在namspace中声明函数模板并在类中使用

C++ 在namspace中声明函数模板并在类中使用,c++,C++,可能重复: 在类中使用函数模板时出现编译器错误。函数模板是在单独的源文件和头文件中的命名空间中声明的 下面是一些示例代码 namespace A header file namespace A { ... ... template<typename T1, typename T2 > bool OR(T1* j, vector<T2*>, float cut); ... ... } A cpp file namespace A { ... ...

可能重复:


在类中使用函数模板时出现编译器错误。函数模板是在单独的源文件和头文件中的命名空间中声明的

下面是一些示例代码

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){

      ....
      ....

  }

 }
为头文件命名名称空间
名称空间A{
...
...
模板
布尔或(T1*j,向量,浮点割);
...
...
}
cpp文件
名称空间A{
...
...
模板
布尔或(T1*j,向量,浮点割){
....
....
}
}
然后我在类中使用这个名称空间

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;

    }

 }
B类cpp文件(仅成员函数)
#包括“A.h”
void B::exmaple(){
if(A::OR(m_ptrObj,m_ptrvectorotherobj,m_cut)){

cout编译.cpp时,编译器不知道必须为或生成哪些实例化。因此,您必须将或放入头文件或在.cpp中显式实例化它:

template bool OR<Jet,Jet>(Jet*, vector<Jet*>, float);
模板布尔或(Jet*、向量、浮点);

编译.cpp时,编译器不知道必须为或生成哪些实例化。因此,您必须将或放入头文件,或在.cpp中明确实例化它:

template bool OR<Jet,Jet>(Jet*, vector<Jet*>, float);
模板布尔或(Jet*、向量、浮点);

对于模板的隐式实例化,模板必须在实例化位置可见。也就是说,当您使用
时,编译器必须看到函数模板定义。这通常通过在头文件中定义函数模板来实现


或者,您可以在
A.cpp
文件中显式实例化产品中将要使用的类型的
模板,但在大多数情况下,这很快就会成为维护负担(因为每次使用新类型的模板时,您都必须编辑/重新编译
A.cpp
)要使模板的隐式实例化有效,模板必须在实例化位置可见。也就是说,当您使用
时,编译器必须看到函数模板定义。这通常通过在头文件中定义函数模板来实现


或者,您可以在
A.cpp
文件中显式实例化产品中将要使用的类型的
模板,但在大多数情况下,这很快就会成为维护负担(因为每次使用新类型的模板时,您都必须编辑/重新编译
A.cpp

复制…不,你知道吗,我根本不想麻烦。复制…不,你知道吗,我根本不想麻烦。