12

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

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)

问题:

  • gcc 5.1.0 是否有问题告诉我 std::binder2nd 已弃用
  • 应该更新 Eigen 吗?
  • 如何在不丢失构建的冗长性的情况下使这些特定警告静音?

回答

我认为这std::bind2nd确实已被弃用,并且已在 Eigen 中进行了提交以解决该问题。然而,这个提交还没有与主分支合并:/(并且没有解决问题,因为有些std::bind2nd仍然存在于 Eigen 的代码中)

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

4

3 回答 3

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

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

  • 应该更新 Eigen 吗?

是的。如果它想要与 C++17 兼容,那么std::bind2nd在 C++14 之后根本不存在。

  • 如何在不丢失构建的冗长性的情况下使这些特定警告静音?

抑制警告。在包含 Eigen 标头时在命令行上编译-Wno-deprecated-declarations或在源代码中进行编译:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#include <eigen/whatever.h>
#pragma GCC diagnostic pop

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

#pragma GCC system_header
#include <eigen/whatever.h>
于 2015-09-29T12:23:17.463 回答
1

我怎样才能在不失去冗长的情况下沉默那些特定的警告?

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

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

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

于 2018-01-31T19:41:01.470 回答
0

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

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

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

归功于Ilya Popov在原始问题中的评论。

于 2015-09-29T11:57:40.853 回答