我试图用特征引用的参数调用模板函数时会遇到汇编错误。
例如,请考虑以下简化示例:
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);