编辑:这不是标准模板问题的拷贝。
我的场景涉及一个模板化类和该类的一个成员函数,其中一个参数是模板化的,但与类的类型不同。
即使我将定义放在标题中,我仍然找不到正确的语法。
有人可以帮我解决我的具体问题吗?
我过于简化的代码:
Foo.h:
template<typename T1>
class Foo {
public:
template<typename T2>
static void bar(vector<T1>& a, vector<T2>& b);
};
Foo.cpp:
#include <Foo.h>
template<typename T1>
template<typename T2>
void Foo<T1>::bar(vector<T1>& a, vector<T2>& b) {
//code logic
}
咕.cpp:
#include <Foo.h>
int main(int argc, char** argv) {
vector<int> a;
vector<double> b;
Foo<int>::bar(a, b);
}
我的错误:
undefined reference to
void Foo<int>::bar<double>(std::vector<int, std::allocator<int> >&,
std::vector<double, std::allocator<double> >&)
我找不到定义模板的正确方法。
我还注意到类型名的顺序会改变错误(还将整个函数放在类声明中)。
什么是正确的语法?
最佳答案
您的问题不在声明或定义中。问题是定义和声明的 split 。你这样做是行不通的。编译 foo.cpp
时,看不到模板的使用,因此不会创建任何实例。编译 goo.cpp
时,链接器将因此无法链接到它们。
这就是这个错误的意思:
undefined reference to 'void Foo<int>::bar<double>(std::vector<int, std::allocator<int> >&, std::vector<double, std::allocator<double> >&)'
如果你真的想做你正在做的事情,你需要对每种类型的组合使用显式实例化。
将 foo.cpp
改成这样(注意最后一行的显式实例化定义):
template<typename T1>
template<typename T2>
void Foo<T1>::bar(std::vector<T1>& a, std::vector<T2>& b) {
//code logic
}
template void Foo<int>::bar(std::vector<int>&, std::vector<double>&);
关于c++ - 在模板化类中,如何定义具有不同类型名称的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46039261/