给定以下课程:
struct foo : public boost::static_visitor<> {
void do_stuff(int item) {}
}
现在,在另一个上下文中,我有一个std::vector<foo>
并且想要对其执行以下算法:
using namespace std::tr1;
using namespace std::tr1::placeholders;
std::vector<foo> items;
std::for_each(items.begin(), items.end(), bind(&foo::do_stuff, _1));
这会引发一个巨大的模板错误消息,归结为对std::tr1::ref
or的模棱两可的调用boost::ref
。boost::static_visitor
如果我从一切中删除基类,则foo
一切正常。
据我了解,问题在于在代码的深处,在没有命名空间限定std::tr1::bind
的情况下调用了 a 。ref(arg)
因为bind
在命名空间std::tr1
中,std::tr1::ref
所以在范围内。但是,因为foo
继承自命名空间中的类boost
,ADL 也会找到boost::ref
. 这种理解正确吗?
由于我需要那个基类(它是Boost.Variant的一部分),我需要知道这里是否有任何方法可以从我的代码中消除这个调用的歧义?
注意:我在这里坚持使用 C++03,因此使用std::tr1
.