C++模板类使用函数前置声明后外部定义报错如何解决?
问题原因及解决方案
报错核心原因
- 模板类的成员函数在类外定义时,必须先声明模板参数,且类名需要携带模板参数列表。原代码直接写
vector::vector没有指定模板参数,编译器无法识别这是模板类的成员函数实现。 - 函数默认参数只能放在类内的声明处,不能放在类外的实现部分,原代码把构造函数的默认参数写在了类外实现,导致调用时编译器无法识别默认参数,提示参数数量不匹配。
- 构造函数中存在逻辑顺序错误:先使用未初始化的
size变量申请数组空间,之后才给size赋值,会导致申请的数组大小是随机垃圾值,存在内存访问风险。 - 类外定义
sum_vector函数时,返回值user_defined_variable是模板类的参数类型,脱离模板声明后编译器无法识别该类型。
修正后的完整代码
#include <iostream> using namespace std; template <class user_defined_variable> class vector { int size; public: user_defined_variable *arr; // 默认参数放在类内声明处 vector(int si = 1, bool choice = false); user_defined_variable sum_vector(); }; // 类外实现先声明模板参数,类名携带模板参数 template <class user_defined_variable> vector<user_defined_variable>::vector(int si, bool choice) { // 先给size赋值再申请空间,避免使用未初始化变量 size = si; arr = new user_defined_variable[size]; if (choice) { cout << "Constructor is called! and size of array is " << size << endl; } } // 类外实现成员函数同样需要声明模板参数 template <class user_defined_variable> user_defined_variable vector<user_defined_variable>::sum_vector() { user_defined_variable sum = 0; for (int i = 0; i < size; i++) { sum += this->arr[i]; } return sum; } int main() { vector<float> vec_1(3); vec_1.arr[0] = 5.6; vec_1.arr[1] = 2.12; vec_1.arr[2] = 3.004; cout << vec_1.sum_vector() << endl; // 释放堆内存避免泄漏 delete[] vec_1.arr; return 0; }
内容的提问来源于stack exchange,提问作者Aman Rathore
相关产品推荐
相关产品推荐

