以下代码可以轻松修复,但很烦人。
#include <functional>
#include <boost/bind.hpp>
void foo() {
using namespace std::placeholders;
std::bind(_1, _2, _3); // ambiguous
}
有一个宏BOOST_BIND_NO_PLACEHOLDERS
,但是使用此宏也会带来一些弊端,例如导致boost::placeholders
从包含在<boost/bind.hpp>
但不包含在<boost/bind/placeholders.hpp>
的编译单元中消失。>
名称冲突也与其他库(例如boost::mpl
)一起出现,我不认为维护人员不知道问题所在,但我想知道为什么他们坚持不弃用和删除using namespace boost::placeholders
在<boost/bind.hpp>
中。
答案 0 :(得分:2)
看起来它已在较新版本的 boost 中得到修复。
当包含 boost/bind.hpp
时,我们会收到以下消息:
#pragma message: The practice of declaring the Bind placeholders (_1, _2, ...) in the global namespace is deprecated. Please use <boost/bind/bind.hpp> + using namespace boost::placeholders, or define BOOST_BIND_GLOBAL_PLACEHOLDERS to retain the current behavior.
解决方案在https://www.boost.org/doc/libs/1_73_0/boost/bind.hpp
中描述所以“良好做法”的解决方法是代替
#include <boost/bind.hpp>
将 boost::placeholders 放在全局命名空间中
做
#include <boost/bind/bind.hpp>
它不会将 boost:: 占位符放在全局命名空间中。
然后直接使用像boost::placeholders::_1
这样的限定名,或者在本地做using namespace boost::placeholders
答案 1 :(得分:0)
您可以使用
#define BOOST_BIND_NO_PLACEHOLDERS
在包含其他Boost头之前。
我不知道什么时候引入它,只是它在1.67中起作用。随时进行编辑,获得更准确的信息。