Eigen初始化MatrixXi报错:列表初始化无匹配构造函数
Eigen MatrixXi列表初始化编译失败的解决办法
问题场景
编译Eigen代码时,Vector3d类型变量可正常初始化,但MatrixXi用双层大括号初始化报错。编译命令:
g++ -std=c++11 -I /usr/include/eigen3/Eigen eigen.cpp -o eigen
报错核心信息:
no matching function for call to ‘Eigen::Matrix<int, -1, -1>::Matrix(<brace-enclosed initializer list>)’
原因分析
Eigen在C11标准下,动态大小矩阵(如MatrixXi)不支持双层大括号的聚合初始化——C11的列表初始化语法对嵌套大括号的处理有限,Eigen对动态矩阵的这种初始化支持是从C++14版本开始完善的。
解决方案
方案1:升级编译标准到C++14及以上
修改编译命令,将C标准指定为C14或更高版本:
g++ -std=c++14 -I /usr/include/eigen3/Eigen eigen.cpp -o eigen
此时原代码的双层大括号初始化可正常编译运行。
方案2:使用C++11兼容的初始化方式
如果必须保留C++11标准,改用Eigen提供的逗号初始化语法,先指定矩阵大小再赋值:
#include <iostream> #include <eigen3/Eigen/Dense> using namespace std; using namespace Eigen; int main() { Vector3d b(5.0, 6.0, 7.0); // 先指定2x2矩阵大小,再用逗号初始化 MatrixXi a(2, 2); a << 1, 2, 3, 4; cout << b << endl; cout << a << endl; }
内容的提问来源于stack exchange,提问作者persona
相关产品推荐
相关产品推荐

