尝试使用属性引用的参数调用模板化函数时,出现编译错误。
例如,请考虑以下简化示例:
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
。
但这很糟糕,我让代码变得非常混乱。我错过了一些明显的解决方案吗?任何帮助,将不胜感激。 谢谢!
Ť
答案 0 :(得分:2)
这是因为在c ++中,您无法将临时对象(此处为.block()
返回的代理对象)绑定到非const引用。解决方案是命名它:
auto A_block = A.block<9,6>(10,10);
fcn(A_block);