编辑:这是 NOT 标准模板问题的副本。
我的场景涉及一个模板化的类和该类的成员函数,其中一个参数是模板化的,但与类的类型不同。
即使我将标题放在标题中,我仍然无法找到正确的语法。
有人可以帮我解决我的具体问题吗?
我的过度简化代码:
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
}
Goo.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> >&)
我无法找到定义模板的正确方法。
我还注意到类型名的顺序会改变错误(也将整个函数放在类声明中)。
正确的语法是什么?
答案 0 :(得分:1)
您的问题不在声明或定义中。问题在于定义和声明的分裂。这不会像你这样做。编译foo.cpp
时,不会看到模板的使用,因此不会创建任何实例。编译goo.cpp
时,链接器将无法链接到它们。
这个错误意味着什么:
未定义引用'void Foo&lt; int&gt; :: bar&lt; double&gt;(std :: vector&lt; int,std :: allocator&lt; int&gt;&gt;&amp;,std :: vector&lt; double,std :: allocator&lt;双&gt;&gt;&amp;)'
如果你真的想做你正在做的事情,你需要对每种类型的组合使用显式实例化。
将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>&);