【问题标题】:Eigen template on scalar type fails to compile fixed-size submatrix operation标量类型的特征模板无法编译固定大小的子矩阵操作
【发布时间】:2020-01-05 12:53:34
【问题描述】:

谁能解释为什么这个 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>();

据我所知,所有子矩阵运算都会发生同样的事情。 Eigen 是 3.3.7 版本。

【问题讨论】:

    标签: c++ templates eigen eigen3


    【解决方案1】:

    错误信息有点混乱,所以我花了一些时间才弄清楚子矩阵操作本身就是模板类中的模板调用,所以正确的调用是:

    m.template tail<2>();
    
    猜你喜欢
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-23
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    相关资源
    最近更新 更多