【发布时间】:2015-05-29 17:45:52
【问题描述】:
我刚刚重新开始了一个搁置了几个月的项目。上次我编译它时它工作得很好,没有任何错误或警告。 然而,当我今天早些时候尝试编译它时,我收到了这个警告
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 确实已被弃用,而a commit has been done to solve that in Eigen。但是,此提交尚未与主分支合并:/(并且无法解决问题,因为 Eigen 的代码中仍然存在一些 std::bind2nd)
底线是:Eigen 的最后一个稳定版本已被弃用
【问题讨论】:
-
如果您想知道:从 C++11 开始,我们鼓励您使用
std::bind而不是std::bind2nd(或其姐妹std::bind1st)。std::bind是可变参数模板。 -
@user465139:我知道一直使用
std::bind,甚至不知道std::bind2nd。但是,这里的问题发生在 Eigen 中,我显然没有自己写 -
感谢您的评论,现在我意识到我的评论很容易被误解。我并不是说这是你的“错”,显然这取决于 Eigen 开发人员来改变这一点。我想说的是
std::bind是推荐使用的功能。我的评论是为了帮助那些可能不知道std::bind但我表达自己有点笨拙的人...... -
警告信息本身告诉你这个警告是由
-Wdeprecated-declarations标志控制的。因此,要(暂时)摆脱这些警告,请使用-Wno-deprecated-declarations标志进行编译。 -
您可以做的另一件事是使用
-isystem而不是-I标志为gcc 指定Eigen 的包含目录(对于cmake,它是include_directories(SYSTEM ...))。这样就不会显示来自 Eigen 包含的警告。