1

我有一个适用于 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 编译器发生内部错误。

4

1 回答 1

1

根据我对 MSVC++ 的经验,它不能像其他编译器那样处理长输入。它喜欢紧凑的编译单元和 PCH(预编译头文件)。因为模板总是只有头文件,所以它们通常会导致大量或递归 #include 指令和长编译单元。MSVC++ 有时无法处理并导致内部编译器错误。恕我直言,这是你的情况。将代码解耦到几个编译单元,广泛使用前向声明和 Pimpls 以及将 #include 指令从 *.hpp 移动到 *.cpp 通常对我有用。

于 2018-01-13T02:07:29.503 回答