模板函数专用化的内部编译器错误



我有一个适用于 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(预编译头(。由于模板始终是仅标头的,因此它们通常会导致大量或递归 #include 指令和长编译单元。MSVC++ 有时无法处理这种情况并导致内部编译器错误。恕我直言,这是你的情况。将代码解耦到几个编译单元,广泛使用前向声明和 Pimpls 以及将 #include 指令从 *.hpp 移动到 *.cpp通常对我有用。

最新更新