首页 > 解决方案 > 用 C++17 编译 Eigen 需要 _SILENCE_CXX17_NEGATORS_DEPRECATION_WARNING 定义

问题描述

我正在尝试分配一个稀疏矩阵块并且无法使其工作。似乎不推荐使用 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(), 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:\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:

提前致谢!

标签: c++c++17eigen

解决方案


这里有两个非常不同的问题。首先,您应该在 C++14 模式下编译或_SILENCE_CXX17_NEGATORS_DEPRECATION_WARNING按要求定义。

其次,该行m.block(0, 0, 2, 2) << 1, 2, 3, 4;对 a 无效SparseMatrix。我不知道你想要实现什么,但除非你真的知道你在做什么(即你的代码在内存重新分配和重新复制方面意味着什么),你应该坚持SparseMatrix通过三元组列表组装一个由doc推荐。


推荐阅读