Не удается заменить скаляр на шаблон

Я пытаюсь написать функцию, которая принимает 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: ошибка: запрос на транспонирование члена 'in' (0, 0) ', который не относится к типу класса' int 'result.block ‹3,3> (0,0) = T.block‹ 3,3> (0,0) .transpose ( );

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


person Jan Rüegg    schedule 02.10.2014    source источник


Ответы (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;
}
person Jarod42    schedule 02.10.2014
comment
Замечательно, это работает! Хотя я не уверен, что понимаю, что именно происходит, и какой блок шаблона делает ... не могли бы вы объяснить подробно или дать мне какой-нибудь указатель на объяснение? - person Jan Rüegg; 02.10.2014
comment
Вы можете посмотреть where- and-why-do-i-have-to-put-the-template-and-typename-keywords - person Jarod42; 02.10.2014