c++ - 标量类型上的 Eigen 模板无法编译固定大小的子矩阵操作

标签 c++ templates eigen eigen3

有人可以解释为什么此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。

最佳答案

该错误消息有点令人困惑,因此我花了一些时间弄清以下事实:子矩阵操作本身就是模板类内部的模板调用,因此正确的调用是:

m.template tail<2>();

关于c++ - 标量类型上的 Eigen 模板无法编译固定大小的子矩阵操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59600059/

相关文章:

c++ - 推导指针非类型模板参数的类型

julia - 对于固定大小的小矩阵,Eigen 的速度有多快?

c++ - 从控制台将输入作为段落

c++ - 为什么 C++ 允许对派生类方法进行更严格的访问?

templates - 在 Flask 中同时渲染多个模板

HTML 输出被解释为纯文本而不是被接收为 html

c++ - Eigen 叉积类型转换

c++ - 为什么 Eigen 的 Cholesky 分解在 Linux 上比在 Windows 上快得多?

c++ - 使用 -fno-rtti 在 OS X 上引发和捕获异常的问题

c++ - Lua DLL 库依赖