1

给定以下课程:

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::refor的模棱两可的调用boost::refboost::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.

4

1 回答 1

0

Jesse 提供了一个答案的链接,该答案是该问题的解决方案。但是,在这种特殊情况下,我想出了一个不同的解决方案。boost::static_visitor只有一个功能,它提供了一个result_typetypedef。这可以很容易地手动添加,并且不再需要基类。

于 2014-02-02T19:54:33.050 回答