Eigen & GCC 5 : class std::binder2nd 已弃用

Eigen & GCC 5 : class std::binder2nd is deprecated

我刚刚重新开始一个搁置了几个月的项目。上次我编译它时它工作得很好,没有任何错误或警告。 然而,当我今天早些时候尝试编译它时,我收到了这个警告

attention : ‘template<class _Operation> class std::binder2nd’ is deprecated [-Wdeprecated-declarations]

当我在整个项目中使用 Eigen/Geometry 时,这个警告实际上出现了数百次

In file included from [...]/include/Eigen/src/Core/ArrayBase.h:109:0,
                 from [...]/include/Eigen/Core:350,
                 from [...]/include/Eigen/Geometry:4,
                 from [...]/include/[myproject]/types.hh:8,
                 from [...]/include/[myproject]/voronoi.hh:8

从那以后我就没有更新过Eigen(用的是3.2.4,今天还是最后一次更新)。 不过自从上次编译后,GCC已经更新到5.1.0了(我用的是archlinux)

问题:


回答

我很高兴 std::bind2nd 确实被弃用了 a commit has been done to solve that in Eigen。但是,此提交尚未与主分支合并:/(并且没有解决问题,因为一些 std::bind2nd 仍然存在于 Eigen 的代码中)

底线是:Eigen 的最后一个稳定版本已弃用

不使用 -I 标志来包含文件,而是使用 -isystem 来包含 Eigen headers:

g++-5 -isystem/usr/include/eigen3 source_file_here.cpp

此标志适用于不符合 C 标准但在生成警告时被视为误报的系统 headers。 Eigen headers 的使用与系统 headers 非常相似,因此对于大多数用户来说,警告没有帮助,而只是令人讨厌的误报。

感谢 Ilya Popov 在原始问题中的评论。

  • gcc 5.1.0 是否有问题告诉我 std::binder2nd 已被弃用

不,C++ 标准说它在 C++11 中已被弃用,因此如果您在 C++11 模式下编译,那么它应该被弃用。

  • 是否应该更新 Eigen?

是的。如果它想与 C++17 兼容,因为 std::bind2nd 根本不存在 post-C++14。

  • 如何在不丢失构建的冗长性的情况下消除那些特定的警告?

取消警告。在 command-line 上使用 -Wno-deprecated-declarations 进行编译,或者在包含 Eigen headers:

时在源代码中进行编译
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#include <eigen/whatever.h>
#pragma GCC diagnostic pop

或者,正如另一个答案所说,告诉 GCC 将 Eigen headers 视为系统 headers,如果它们在 /usr/include 中或被包含在内,这会自动发生-isystem,或包含在另一个 header 中:

#pragma GCC system_header
#include <eigen/whatever.h>

How can I silent those specific warning without loosing the verbosity ?

编辑CMakeLists.txt 文件。在设置 CMAKE_CXX_FLAGS 后的某处添加此行。

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")

之前的回答提到将其添加到#pragma 或命令行。我对#pragma 有偏见,因为我发现后来很难记住我把它放在哪里。所以作为一般做法,我尽量避免#pragma。添加到命令行意味着你必须记住每次重新编译时都要输入这个。