C++使用newmat矩阵时vector无调用运算符及push_back匹配错误求解
问题排查与解决方案
错误原因分析
1. Type 'vector' does not provide a call operator 报错
C++中std::vector的元素访问运算符为方括号[],代码中使用temp(i)的写法会被编译器识别为调用temp对象的operator()调用运算符,但std::vector并没有实现该运算符,因此触发报错。
2. No matching member function for call to 'push_back' 报错
该报错由两个类型不匹配问题叠加导致:
- 定义的二维向量
B类型为vector<vector<double>>,push_back方法要求传入的参数必须是vector<double>类型,但代码中传入的是temp(i)单个元素值,类型不匹配 - 定义的
temp为vector<int>类型,和B要求的元素类型vector<double>也存在类型不匹配
除此之外代码还存在两处隐藏问题:
temp未初始化容量就直接通过索引赋值,会触发数组越界- 第一层循环中每次迭代都会覆盖
temp的内容,最终temp只会保留最后一列的数值,后续筛选逻辑无法拿到历史列的内容
修复步骤
- 所有
temp的元素访问语法统一从圆括号()改为方括号[] - 将
temp的类型改为vector<double>,同时初始化容量匹配需要存储的元素数量 - 调整循环逻辑,每读取完一列就判断是否要存入
B,避免temp内容被覆盖
修正后代码示例
#include <vector> // 已正确引入newmat相关头文件 using namespace std; // 矩阵A、rank_of_A、did_i_pick_this_col已提前正确定义 vector<vector<double>> B; int col_num = A.ncols(); for (int i = 1; i <= col_num; ++i) { // 遍历矩阵每一列 vector<double> temp(rank_of_A); // 每次循环新建temp存储当前列元素 for (int j = 1; j < rank_of_A; ++j) { // vector为0-based索引,newmat矩阵为1-based索引,注意下标偏移 // 如果需要按行存储可修改为temp[j-1] = A(i,j),根据实际需求调整索引即可 temp[j-1] = A(j, i); } // 如果did_i_pick_this_col是0-based数组注意下标偏移 if (did_i_pick_this_col[i-1]) { B.push_back(temp); // 传入整列temp向量 } }
内容的提问来源于stack exchange,提问作者Pallavi Prakash
相关产品推荐
相关产品推荐

