У меня есть собственное преобразование t
, определенное с помощью double. Следующие примеры работают:
Vector3d d_point, t_d_point, d_vector, t_d_vector; // Initialization not shown
Vector3f f_point, t_f_point, f_vector, t_f_vector;
// Transforming points
t_d_point = t * d_point;
t_f_point = t.template cast<float>() * f_point;
// Transforming vectors
t_d_vector = t.linear() * d_vector;
t_f_vector = t.template cast<float>().linear() * f_vector;
Если я объявляю функцию
template <typename Transform, typename Derived>
inline auto transformPoint(const Transform & t, const Eigen::MatrixBase<Derived> & point) {
return t.template cast<typename Derived::Scalar>() * point;
}
, работают следующие функции:
t_d_point = transformPoint(t, d_point);
t_f_point = transformPoint(t, f_point);
Однако, векторная версия
template <typename Transform, typename Derived>
inline auto transformVector(const Transform & t, const Eigen::MatrixBase<Derived> & vector) {
return t.template cast<typename Derived::Scalar>().linear() * vector;
}
работает, когда приведение не требуется (преобразование и вектор определяются с помощью двойных чисел):
t_d_vector = transformVector(t * d_vector);
, но завершается неудачно, когда приведение необходимо, возвращая в результате мусор:
t_f_vector = transformVector(t * f_vector);
Учитывая, что t.template cast<float>().linear() * f_vector
работает, что такое правильное объявление для функции transformVector()
?