Выпуск кастинг 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
типы.
Еще немного информации о системе:
- Ubuntu 14.04
- g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2
- Eigen 3.2.4, загружено с http://eigen.tuxfamily.org/
Заранее спасибо за вашу помощь!
1 ответ:
Спасибо, @piotr-s! Похоже, что это не специфичная для Eigen вещь, а более общий просто какой-то хитрый синтаксис для вызова шаблонных функций-членов.
Вот связанный с этим вопрос: Как вызвать функцию-член шаблона?
Вот ответ:
mat_d = mat_s.template cast<double>();