通过模板发出C++ Eigen :: Matrix类型的问题

vpr*_*eep 5 c++ templates eigen eigen3

我正在写上型模板(或者C++函数floatdouble),并使用Eigen::Matrix内部.该函数将被使用的组合float,double和模板类型Eigen:Matrix的对象. Eigen::Matrix<>::cast()作品只是罚款doublefloat,虽然我与模板类型使用时打一个奇怪的问题.见下面的代码:

#include "Eigen/Core"  // Version 3.2.4 (eigen-eigen-10219c95fe65)

template <typename Scalar>
void Foo() {
  Eigen::Matrix<double, 3, 1> mat_d = Eigen::Matrix<double, 3, 1>::Zero();
  Eigen::Matrix<float,  3, 1> mat_f = Eigen::Matrix<float,  3, 1>::Zero();
  Eigen::Matrix<Scalar, 3, 1> mat_s = Eigen::Matrix<Scalar, 3, 1>::Zero();

  mat_d = mat_f.cast<double>();  // Works
  mat_f = mat_f.cast<float>();   // Works

  mat_s = mat_f.cast<Scalar>();  // Works
  mat_s = mat_d.cast<Scalar>();  // Works

  mat_d = mat_s.cast<double>();  // Broken
  mat_f = mat_s.cast<float>();   // Broken
}

int main() {
  Foo<double>();
  Foo<float>();
}
Run Code Online (Sandbox Code Playgroud)

这是编译的结果:

> g++ casting.cpp
casting.cpp: In function ‘void Foo()’:
casting.cpp:16:22: error: expected primary-expression before ‘double’
   mat_d = mat_s.cast<double>();  // Broken
                      ^
casting.cpp:16:22: error: expected ‘;’ before ‘double’
casting.cpp:17:22: error: expected primary-expression before ‘float’
   mat_f = mat_s.cast<float>();   // Broken
                      ^
casting.cpp:17:22: error: expected ‘;’ before ‘float’
Run Code Online (Sandbox Code Playgroud)

由于我只使用过的实例化模板Scalar作为double或者float,我会想象,Scalar函数调用应具有与硬编码相同的效果float/ double类型.

更多系统信息:

在此先感谢您的帮助!

vpr*_*eep 6

谢谢,@ piotr-s!看起来这不是特定于特定的东西,但更一般地说只是一些用于调用模板化成员函数的棘手语法.

这是一个相关的问题:如何调用模板成员函数?

这是答案:

mat_d = mat_s.template cast<double>();