У меня есть два настроенных скалярных типа T
и S
.Я перегрузил матричный продукт operator*
между собственной матрицей T
и S
, как предложено в Смешивание скалярных типов в Eigen
template <typename MatrixL, typename MatrixR>
typename std::enable<(std::is_same<MatrixL::Scalar, T>::value && std::is_same<MatrixR::Scalar,S>::value) || (std::is_same<MatrixR::Scalar, T>::value && std::is_same<MatrixL::Scalar, S>::value), Eigen::Matrix<T, MatrixL::RowsAtCompileTime, MatrixR::ColsAtCompileTime>::type
operator*(const MatrixL& lhs, const MatrixR& rhs) {
return lhs.template cast<T>() * rhs.template cast<T>();
}
Я обнаружил, что могу умножить статическоематрица с другой статической размерностью, или матрица статического размера, умноженная на матрицу динамического размера.Но компилятор потерпит неудачу для матрицы динамического размера, умножающей другую матрицу динамического размера.
Eigen::Matrix<T, 2, 2> T_static;
Eigen::Matrix<T, Dynamic, Dynamic> T_dynamic(2, 2);
Eigen::Matrix<S, 2, 2> S_static;
Eigen::Matrix<S, Dynamic, Dynamic> S_dynamic(2, 2);
T_static * S_static; // works
T_static * S_dynamic; // works
T_dynamic * S_static; // works
T_dynamic * S_dynamic; // compilation error
Полученная ошибка выглядит следующим образом:
external/eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h:435:28: note: template argument deduction/substitution failed:
external/eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h:1413:13: note: deduced conflicting types for parameter 'AccPacketType' ('drake::symbolic::RationalFunction' and 'Eigen::internal::gebp_kernel<drake::symbolic::RationalFunction, drake::symbolic::Polynomial, long int, Eigen::internal::blas_data_mapper<drake::symbolic::RationalFunction, long int, 0, 0>, 2, 4, false, false>::RhsPacket {aka drake::symbolic::Polynomial}')
EIGEN_GEBGP_ONESTEP(6);
^
external/eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h:1413:13: error: no matching function for call to 'Eigen::internal::gebp_traits<drake::symbolic::RationalFunction, drake::symbolic::Polynomial, false, false>::madd(Eigen::internal::gebp_kernel<drake::symbolic::RationalFunction, drake::symbolic::Polynomial, long int, Eigen::internal::blas_data_mapper<drake::symbolic::RationalFunction, long int, 0, 0>, 2, 4, false, false>::LhsPacket&, Eigen::internal::gebp_kernel<drake::symbolic::RationalFunction, drake::symbolic::Polynomial, long int, Eigen::internal::blas_data_mapper<drake::symbolic::RationalFunction, long int, 0, 0>, 2, 4, false, false>::RhsPacket&, Eigen::internal::gebp_kernel<drake::symbolic::RationalFunction, drake::symbolic::Polynomial, long int, Eigen::internal::blas_data_mapper<drake::symbolic::RationalFunction, long int, 0, 0>, 2, 4, false, false>::AccPacket&, Eigen::internal::gebp_kernel<drake::symbolic::RationalFunction, drake::symbolic::Polynomial, long int, Eigen::internal::blas_data_mapper<drake::symbolic::RationalFunction, long int, 0, 0>, 2, 4, false, false>::RhsPacket&)'
EIGEN_GEBGP_ONESTEP(6);
, где drake::symbolic::Polynomial
- это тип S
, иdrake::symbolic::RationalFunction
это тип T
.Я использую llvm-4.0 на машине с Ubuntu 16.04.