Внутренняя ошибка компилятора при специализации шаблонной функции

У меня есть код, который работал на 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 Произошла внутренняя ошибка в компиляторе.

0

Решение

Из моего опыта работы с MSVC ++ он не обрабатывает длинные входные данные так же, как другие компиляторы. Ему нравятся компактные модули компиляции и PCH (Pre-Compiled Headers). Поскольку шаблоны всегда только для заголовков, они обычно вызывают лоты или рекурсивные директивы #include и длинные единицы компиляции. MSVC ++ иногда не может справиться с этим и вызывает ошибку внутреннего компилятора. ИМХО это твой случай. Разделение кода на несколько модулей компиляции, широкое использование предварительных объявлений и Pimpls и перемещение директив #include из * .hpp в * .cpp обычно работали для меня.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]