Выпуск кастинг C++ Eigen:: типы матриц через шаблоны


Я пишу функцию C++, которая шаблонна по типу (либо float, либо double) и использует Eigen::Matrix внутренне. Функция будет использовать комбинацию из float, double, и шаблонные объекты типа Eigen:Matrix. Eigen::Matrix<>::cast() отлично работает для double и float, хотя я сталкиваюсь со странной проблемой при использовании его с шаблонными типами. Смотрите код ниже:

#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 как double или float, я бы представьте, что вызовы функций Scalar должны иметь тот же эффект, что и жестко закодированные float/double типы.

Еще немного информации о системе:

Заранее спасибо за вашу помощь!

1 4

1 ответ:

Спасибо, @piotr-s! Похоже, что это не специфичная для Eigen вещь, а более общий просто какой-то хитрый синтаксис для вызова шаблонных функций-членов.

Вот связанный с этим вопрос: Как вызвать функцию-член шаблона?

Вот ответ:

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