标量类型的特征模板无法编译固定大小的子矩阵操作
Eigen template on scalar type fails to compile fixed-size submatrix operation
谁能解释一下为什么这个 MWE 编译失败:
template<typename Scalar>
class ScalarTemplate {
public:
static Eigen::Matrix<Scalar, 2, 1> tail(){
Eigen::Matrix<Scalar, 3, 1> m;
return m.tail<2>();
}
};
int main() {
auto tail = ScalarTemplate<float>::tail();
}
非常简单,所有相关的 Eigen 模板都应使用 float
进行初始化,并且所有容器大小都应在编译时已知。然而这会产生以下结果:
../src/main.cpp: In static member function 'static Eigen::Matrix<_Scalar, 2, 1> ScalarTemplate<Scalar>::tail()':
../src/main.cpp:24:26: error: expected primary-expression before ')' token
return m.tail<2>();
^
../src/main.cpp: In instantiation of 'static Eigen::Matrix<_Scalar, 2, 1> ScalarTemplate<Scalar>::tail() [with Scalar = float]':
../src/main.cpp:29:40: required from here
../src/main.cpp:24:22: error: invalid operands of types '<unresolved overloaded function type>' and 'int' to binary 'operator<'
return m.tail<2>();
据我所知,所有子矩阵运算都会发生同样的事情。本征是版本 3.3.7.
错误消息有点令人困惑,所以我花了一些时间才弄清楚子矩阵操作本身就是模板内部的模板调用 class,所以正确的调用是:
m.template tail<2>();
谁能解释一下为什么这个 MWE 编译失败:
template<typename Scalar>
class ScalarTemplate {
public:
static Eigen::Matrix<Scalar, 2, 1> tail(){
Eigen::Matrix<Scalar, 3, 1> m;
return m.tail<2>();
}
};
int main() {
auto tail = ScalarTemplate<float>::tail();
}
非常简单,所有相关的 Eigen 模板都应使用 float
进行初始化,并且所有容器大小都应在编译时已知。然而这会产生以下结果:
../src/main.cpp: In static member function 'static Eigen::Matrix<_Scalar, 2, 1> ScalarTemplate<Scalar>::tail()':
../src/main.cpp:24:26: error: expected primary-expression before ')' token
return m.tail<2>();
^
../src/main.cpp: In instantiation of 'static Eigen::Matrix<_Scalar, 2, 1> ScalarTemplate<Scalar>::tail() [with Scalar = float]':
../src/main.cpp:29:40: required from here
../src/main.cpp:24:22: error: invalid operands of types '<unresolved overloaded function type>' and 'int' to binary 'operator<'
return m.tail<2>();
据我所知,所有子矩阵运算都会发生同样的事情。本征是版本 3.3.7.
错误消息有点令人困惑,所以我花了一些时间才弄清楚子矩阵操作本身就是模板内部的模板调用 class,所以正确的调用是:
m.template tail<2>();