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
)复制…不,你知道吗,我根本不想麻烦。复制…不,你知道吗,我根本不想麻烦。