用c++编写泛型函数
Making a generic function in 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>( ...
错误是什么意思,我如何修复它?
必须在头文件中包含c++模板函数的整个体。
这是因为c++模板的工作方式:模板参数替换只在实际使用模板时发生,并且整个模板定义必须在那时可见。另一种看待它的方式是说您不能编译和链接到templateFunction<T>
—您只能编译模板函数,一旦它被实例化为templateFunction<char>
或其他类型。因此,你不能把模板函数定义放在.cpp
文件中,而必须把它们放在.h
文件中。
编译器需要访问整个模板定义(而不仅仅是签名),以便为模板的每个实例化生成代码,因此您需要将函数的定义移动到头文件中。
这被称为包含模型。也可以阅读这个FAQ
一般来说,源文件中不能有模板定义;它们应该在头文件中,以便编译器可以看到它们。
这个在这里一遍又一遍地出现,所以我懒得再给出完整的解释;.
为什么我不能把模板类的定义和它的声明分开,并把它放在一个。cpp文件中呢?[顺便问一下,为什么要返回一个指针对指针?一个指针就足够了
如果您的代码在另一个cpp文件上使用模板,则模板应该放在头文件上。
相关文章:
- 链表的泛型函数remove()与成员函数remove)
- 以特征类型作为参数的泛型函数回调
- 传递非泛型函数的最有效方法是什么?
- 泛型函数反向打印任何矢量,编译器出错
- 是否可以在C++中创建泛型函数指针?
- 将泛型函数及其参数传递给元函数
- C++ 中的泛型函数持有者
- C++ 验证使泛型函数
- 两个不同流的泛型函数
- 如何覆盖 'const T&' 和 'T&&' 的泛型函数,其中 T 可以作为引用?
- 如何创建公开泛型函数的 DLL
- 为什么 std::apply 使用泛型函数失败
- 在某个值范围内生成 BST 的泛型函数
- 无法在循环中实例化泛型函数
- MISRA C++规则 14-5-1:在与类型关联的命名空间中声明的泛型函数模板的名称
- 使用泛型函数调用打印结构的所有嵌套成员变量
- C++ 使用数组作为参数创建泛型函数
- 泛型函数是否可以用于对结构求和
- C++为所有 std::sets 编写泛型函数
- 指向类成员函数的泛型函数指针