在C ++中创建泛型函数

时间:2011-04-25 14:31:04

标签: c++

我尝试在C ++中创建一个泛型函数,创建一个类型的数组,它依赖于用法(调用它时),比如int或char数组。

这是我头文件中的代码:

template<class T>
T** makeArray(...);

这是在.cpp文件中:

template<class T>
T** ClassA::makeArray(...){
    //...
}

这就是我在主文件中调用它的方式:

char** charArr = cg.makeArray<char>(...);
//...
int** intArr = cg.makeArray<int>(...);

但是在编译时,我会收到这些错误:

undefined reference to `char** ClassA::makeArray<char>( ...
undefined reference to `int** ClassA::makeArray<int>( ...

错误是什么意思,我该如何解决?

4 个答案:

答案 0 :(得分:4)

您必须在标题中包含C ++模板函数的整个主体。

这是因为C ++模板的工作方式:模板参数替换仅在您实际使用模板时发生,并且整个模板定义必须在那时可见。查看它的另一种方式是说你无法编译并链接到templateFunction<T> - 你只能在模板函数被实例化为templateFunction<char>之后编译它。因此,您不能将模板函数定义放在.cpp文件中,而是必须将它们放在.h个文件中。

答案 1 :(得分:2)

编译器需要访问整个模板定义(而不仅仅是签名)才能为模板的每个实例化生成代码,因此您需要将函数的定义移动到标题中。

这称为inclusion model。另请阅读this FAQ

答案 2 :(得分:1)

通常,您不能在源文件中包含模板定义;它们应该在头文件中,以便编译器可以看到它们。

这里一遍又一遍地出现,所以我再也无法给出完整的解释了。我建议您从C ++ FAQ中阅读:Why can't I separate the definition of my templates class from its declaration and put it inside a .cpp file?

[顺便说一下,为什么要返回一个指向指针的指针?指针应该足够......]

答案 3 :(得分:0)

如果您的代码在不同的cpp文件上使用该模板,则该模板应该放在头文件中。