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

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

1 ответ

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

Другие вопросы по тегам