Замена скаляра на шаблон не удалась

Я пытаюсь написать функцию, которая принимает Eigen::Matrix из типа double или float. Эта функция отлично работает для поплавков:

Eigen::Matrix<float, 4, 4> foo(const Eigen::Matrix<float, 4, 4> &T)
{
   Eigen::Matrix<float, 4, 4> result;
   result.block<3,3>(0,0) = T.block<3,3>(0,0).transpose();
   return result;
}

Однако, как только я сделаю "плавающий" шаблон:

template <typename Scalar>
inline Eigen::Matrix<Scalar, 4, 4> foo(const Eigen::Matrix<Scalar, 4, 4> &T)
{
   Eigen::Matrix<Scalar, 4, 4> result;
   result.block<3,3>(0,0) = T.block<3,3>(0,0).transpose();
   return result;
}

Я получаю эту ошибку с GCC 4.9.1 на Linux:

... / utils.hpp: В функции 'Eigen::Matrix core::math::foo(const Eigen::Matrix&)': .../utils.hpp:77:47: ошибка: запрос на член 'transpose' in '(0, 0)', который имеет тип, не относящийся к классу'int' result.block<3,3>(0,0) = T.block<3,3>(0,0).transpose();

В чем может быть проблема здесь?

1 ответ

Решение

Когда функция является шаблоном, некоторые вызовы зависят от шаблона, поэтому вам нужно добавить несколько template ключевое слово, попробуйте:

template <typename Scalar>
inline Eigen::Matrix<Scalar, 4, 4> foo(const Eigen::Matrix<Scalar, 4, 4> &T)
{
   Eigen::Matrix<Scalar, 4, 4> result;
   result.template block<3,3>(0,0) = T.template block<3,3>(0,0).transpose();
   return result;
}
Другие вопросы по тегам