使用C ++ 17编译本征需要_SILENCE_CXX17_NEGATORS_DEPRECATION_WARNING定义

时间:2018-09-16 20:04:19

标签: c++ c++17 eigen

我正在尝试分配一个稀疏矩阵的块并使它正常工作。似乎本征函数使用的函数已被弃用,我可以通过一些定义来修复它。 但是,我确定是否应将这些定义添加到项目中,或等待更新的Eigen版本。你们能否就定义的副作用提出建议。

我写的程序看起来像这样

#include <Eigen/Sparse>

int main()
{
    Eigen::SparseMatrix<double> m(4, 4);

    m.block(0, 0, 2, 2) << 1, 2, 3, 4;
}

这是警告:

  

1> d:\ eigen_3.3.4 \ eigen \ src \ core \ functors \ stlfunctors.h(87):错误C4996:'std :: unary_negate <_Fn>':警告STL4008:std :: not1(),在C ++ 17中不推荐使用std :: not2(),std :: unary_negate和std :: binary_negate。它们被std :: not_fn()取代。您可以定义_SILENCE_CXX17_NEGATORS_DEPRECATION_WARNING或_SILENCE_ALL_CXX17_DEPRECATION_WARNINGS以确认您已收到此警告。   1> d:\ eigen_3.3.4 \ eigen \ src \ core \ functors \ stlfunctors.h(91):错误C4996:'std :: binary_negate <_Fn>':警告STL4008:std :: not1(),std :: not2(),std :: unary_negate和std :: binary_negate在C ++ 17中已弃用。它们被std :: not_fn()取代。您可以定义_SILENCE_CXX17_NEGATORS_DEPRECATION_WARNING或_SILENCE_ALL_CXX17_DEPRECATION_WARNINGS以确认您已收到此警告。   1> d:\ sandbox \ sandbox.cpp(25):错误C2678:二进制'<<':未找到采用'Eigen :: Block'类型的左操作数的运算符(或没有可接受的转换)   1>与   1> [   1> Derived = Eigen :: SparseMatrix   1>

谢谢!

1 个答案:

答案 0 :(得分:4)

这里有两个非常不同的问题。首先,您应该以C ++ 14模式进行编译,或者按照提示定义_SILENCE_CXX17_NEGATORS_DEPRECATION_WARNING

第二,行m.block(0, 0, 2, 2) << 1, 2, 3, 4;SparseMatrix无效。我不知道您想要实现什么,但是除非您真的知道自己在做什么(即,代码在内存重新分配和重新复制方面将意味着什么),否则您应该坚持组装SparseMatrix通过doc建议的三元组列表。