我尝试在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>( ...
错误是什么意思,我该如何解决?
答案 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文件上使用该模板,则该模板应该放在头文件中。