用c++编写泛型函数

Making a generic function in C++

本文关键字:泛型 函数 c++      更新时间:2023-10-16

我尝试在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>( ...

错误是什么意思,我如何修复它?

必须在头文件中包含c++模板函数的整个体。

这是因为c++模板的工作方式:模板参数替换只在实际使用模板时发生,并且整个模板定义必须在那时可见。另一种看待它的方式是说您不能编译和链接到templateFunction<T> —您只能编译模板函数,一旦它被实例化为templateFunction<char>或其他类型。因此,你不能把模板函数定义放在.cpp文件中,而必须把它们放在.h文件中。

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

这被称为包含模型。也可以阅读这个FAQ

一般来说,源文件中不能有模板定义;它们应该在头文件中,以便编译器可以看到它们。

这个在这里一遍又一遍地出现,所以我懒得再给出完整的解释;.

为什么我不能把模板类的定义和它的声明分开,并把它放在一个。cpp文件中呢?

[顺便问一下,为什么要返回一个指针对指针?一个指针就足够了

如果您的代码在另一个cpp文件上使用模板,则模板应该放在头文件上。