EIGEN库:编译器错误将块引用到模板函数时



我试图用特征引用的参数调用模板函数时会遇到汇编错误。

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

 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,那么当我尝试在功能中修改它时,我会遇到错误。

我发现要解决此问题的唯一解决方案是将函数的放射率声明为 const &,然后在访问函数内部访问M时使用const_cast"删除const限定符"。

,但这很骇人听闻,我使代码变得非常混乱。我是否缺少解决这个问题的明显解决方案?任何帮助,将不胜感激。谢谢!

t

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

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

相关内容

  • 没有找到相关文章

最新更新