通过模板C++特征::矩阵类型进行转换

Issue casting C++ Eigen::Matrix types via templates

本文关键字:类型 转换 C++ 特征      更新时间:2023-10-16

我正在编写一个在类型(floatdouble)上模板化的C++函数,并在内部使用Eigen::Matrix。 该函数将使用floatdouble和模板化类型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>();
}

以下是编译的结果:

> 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’

由于我只将模板实例化为Scalar作为doublefloat,因此我想Scalar函数调用应该与硬编码的float/double类型具有相同的效果。

更多系统信息:

  • 乌班图14.04
  • g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2
  • 特征码 3.2.4,从 http://eigen.tuxfamily.org/下载

提前感谢您的帮助!

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

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

答案如下:

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