У меня есть код, который работал на Lunix / GCC. Однако при компиляции в Windows / MSVC 2017 я сталкиваюсь с internal compiler error
:
.HPP:
namespace g2o {
namespace internal {
template<typename MatrixType>
inline void axpy(const MatrixType& A, const Eigen::Map<const Eigen::VectorXd>& x, int xoff, Eigen::Map<Eigen::VectorXd>& y, int yoff) {
y.segment<MatrixType::RowsAtCompileTime>(yoff) += A * x.segment<MatrixType::ColsAtCompileTime>(xoff);
}
template<int t>
inline void axpy(const Eigen::Matrix<double, Eigen::Dynamic, t>& A, const Eigen::Map<const Eigen::VectorXd>& x, int xoff, Eigen::Map<Eigen::VectorXd>& y, int yoff) {
y.segment(yoff, A.rows()) += A * x.segment<Eigen::Matrix<double, Eigen::Dynamic, t>::ColsAtCompileTime>(xoff);
}
template<> /*******ERROR HERE*******/
inline void axpy(const Eigen::MatrixXd& A, const Eigen::Map<const Eigen::VectorXd>& x, int xoff, Eigen::Map<Eigen::VectorXd>& y, int yoff) {
y.segment(yoff, A.rows()) += A * x.segment(xoff, A.cols());
}
} // end namespace internal
} // end namespace g2o
Я видел решение, говорящее, что я должен сделать следующее:
template<Eigen::MatrixXd> inline void axpy<Eigen::MatrixXd> ....
Однако это не сработало.
Сообщение об ошибке, как это было сгенерировано компилятором:
Ошибка C1001 Произошла внутренняя ошибка в компиляторе.
Из моего опыта работы с MSVC ++ он не обрабатывает длинные входные данные так же, как другие компиляторы. Ему нравятся компактные модули компиляции и PCH (Pre-Compiled Headers). Поскольку шаблоны всегда только для заголовков, они обычно вызывают лоты или рекурсивные директивы #include и длинные единицы компиляции. MSVC ++ иногда не может справиться с этим и вызывает ошибку внутреннего компилятора. ИМХО это твой случай. Разделение кода на несколько модулей компиляции, широкое использование предварительных объявлений и Pimpls и перемещение директив #include из * .hpp в * .cpp обычно работали для меня.
Других решений пока нет …