Eigen Library:将块引用传递给模板化函数时的编译器错误

时间:2018-02-18 21:00:41

标签: eigen eigen3

尝试使用属性引用的参数调用模板化函数时,出现编译错误。

例如,请考虑以下简化示例:

 template <typename derived>
 inline void fcn(Eigen::MatrixBase<derived> &M){
     // ...
 
     M.template block<3,3>(0,0) = something here
     // ...
 
 }
  
// I get compiler errors when trying to call this function as follows:
 
Eigen::MatrixXd A(100,100);
 
// call the above function with a Block as an argument
 fcn(A.block<9,6>(10,10));
 

编译器抱怨我试图用值传递的对象实例化一个非const引用(如果我对以下内容的误解是正确的话):

error: invalid initialization of non-const reference of type ‘Eigen::MatrixBase<Eigen::Block<Eigen::Matrix<double, -1, -1>, 9, 6, false> >&’ from an rvalue of type ‘Eigen::MatrixBase<Eigen::Block<Eigen::Matrix<double, -1, -1>, 9, 6, false> >’

如果我尝试将fcn的参数声明为const,那么当我尝试在函数内部修改它时,我会收到错误。

我发现解决此问题的唯一解决方案是将函数的arument声明为const &,然后使用const_cast来“删除const限定符”访问函数内的M

但这很糟糕,我让代码变得非常混乱。我错过了一些明显的解决方案吗?任何帮助,将不胜感激。 谢谢!

Ť

1 个答案:

答案 0 :(得分:2)

这是因为在c ++中,您无法将临时对象(此处为.block()返回的代理对象)绑定到非const引用。解决方案是命名它:

auto A_block = A.block<9,6>(10,10);
fcn(A_block);