2017-09-04 72 views
1

编辑:这是不是标准模板问题的副本。在模板类中,如何定义具有不同类型名称的函数

我的场景涉及模板类和类蒙山一个参数是模板的成员函数,而不是同类型的类。

即使当我把定义中的标头,我仍然无法找到正确的语法。

有人可以帮助我与我的具体问题?


我过于简单的代码:

了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> >&) 

我找不到合适的方式来定义的模板。

我也注意到,typenames的顺序将改变错误(也把整个函数在类声明)。

什么是正确的语法?

+0

为什么你认为这是不是重复?你不能在源文件中定义模板。 “即使我把这个定义放在标题中,我仍然找不到正确的语法。” ...那你为什么不用头部中的定义显示代码? – user463035818

+0

如果你[编辑]这个问题向我们展示了在头文件中定义的模板成员函数的代码,我们可以重新打开它。用于简化代码的荣誉 - 确保编辑后的简化版本仍然失败,并包含错误消息。 (如果你在评论中提到我,我想我可以单独重新打开它。) –

+0

你的Foo.h有一个错字和一个缺失的分号。请仅复制并粘贴实际尝试编译的代码,并验证是否收到声明的错误消息。 – aschepler

回答

1

你的问题不是在声明或定义。问题是定义和声明的分裂。这不符合你的工作方式。在编译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>&); 
相关问题