在模板化类中,如何定义具有不同类型名称的函数

时间:2017-09-04 14:32:44

标签: c++ templates g++

编辑:这是 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> >&)

我无法找到定义模板的正确方法。

我还注意到类型名的顺序会改变错误(也将整个函数放在类声明中)。

正确的语法是什么?

1 个答案:

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