C++类构造函数中指定维度创建二维vector的编译错误排查
C++类中二维vector矩阵初始化填充问题解决
原始代码及错误
原始代码
class my_function{ public: my_function(double _x , double _y , int_N) { x = _x; y = _y; N= _N; } void Make_matrix() { vector<vector<double>> my_matrix(N+1, vector<double>(N+1)); for (int i = 0; i <= N; i++) { for (int j = 0; j <= i; j++) { my_matrix[i][j] = x*y; cout << my_matrix[i][j] << endl; } } } public: double x; double y; int N; };
报错信息
1.l-value specifies const object 2.'std::vector<std::vector<double,std::allocator<double>>,std::allocator<std::vector<double,std::allocator<double>>>>::vector(const unsigned int,const _Alloc &)': cannot convert argument 2 from'std::vector<int,std::allocator<int>>' to 'const _Alloc &' 3.'my_function::N': an object of const-qualified type must be initialized
错误原因分析
- 核心语法错误:构造函数参数中的
int_N是写法错误,应为int _N(int与参数名_N之间必须加空格)。这个错误导致编译器无法正确识别参数类型,进而对成员变量N的初始化逻辑产生混乱,误判其为const类型,直接引发错误1和3。 - 连锁解析错误:错误2是上述语法错误导致的次生问题,编译器因前期解析混乱,错误识别了vector构造函数的参数类型,修复核心错误后该问题会自动消失。
修正方案及代码
关键修正点
- 修复构造函数参数的语法错误,将
int_N改为int _N - 使用成员初始化列表初始化成员变量,这是C++中更规范、高效的初始化方式
- 补充必要的头文件(
<vector>和<iostream>),并正确使用std命名空间(或给标准库对象添加std::前缀) - 若需在
Make_matrix方法外访问矩阵,可将my_matrix设为类的成员变量(示例中保留局部变量,如需持久化可自行调整)
修正后的完整代码
#include <vector> #include <iostream> class my_function { public: // 成员初始化列表初始化成员变量 my_function(double _x, double _y, int _N) : x(_x), y(_y), N(_N) {} void Make_matrix() { // 初始化(N+1)*(N+1)的二维vector std::vector<std::vector<double>> my_matrix(N + 1, std::vector<double>(N + 1)); for (int i = 0; i <= N; ++i) { for (int j = 0; j <= i; ++j) { my_matrix[i][j] = x * y; std::cout << my_matrix[i][j] << std::endl; } } } public: double x; double y; int N; };
额外说明
- 不需要将
N定义为const类型,vector构造仅需运行时传入合法的非负整数即可 - 若需多次复用矩阵,建议将
my_matrix声明为类的成员变量,避免每次调用Make_matrix都重新创建对象
内容的提问来源于stack exchange,提问作者kyara
相关产品推荐
相关产品推荐

