如何在不同命名空间中与候选人拨打ADL的歧义
How to disambiguate ADL call with candidates in different namespaces?
给定以下类:
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
或boost::ref
的模棱两可的呼叫。如果我从foo
中删除基类boost::static_visitor
,则一切正常。
据我了解,问题在于,在std::tr1::bind
的代码中,ref(arg)
在没有名称空间资格的情况下被调用。由于bind
在命名空间std::tr1
中,因此std::tr1::ref
处于范围。但是,由于foo
从名称空间boost
中的类中继承,因此ADL也找到了boost::ref
。理解正确吗?
由于我需要那个基类(它是boost.variant的一部分),所以我需要在这里知道是否有任何方法可以从我的代码中删除此调用?
注意:我在这里陷于C 03,因此使用std::tr1
。
Jesse提供了一个答案的链接,该链接是解决此问题的解决方案。但是,在这种特殊情况下,我提出了另一种解决方案。boost::static_visitor
只有一个功能,它提供了result_type
Typedef。可以轻松地手动添加,并且不再需要基类。
相关文章:
- 有没有可能有一个只有ADL才能找到的非好友功能
- 函数中的 c++ using 语句,后跟函数名称(对于 ADL?
- 匿名命名空间中类的 ADL
- 表达式中运算符的 GCC 和 ADL
- 为什么 ADL 的运算符函数行为与其他函数不同?
- 使用 std::swap 禁用 ADL
- ADL and typedefs
- ADL 和非类型模板参数
- 函数-本地枚举声明和 ADL 的交互
- 两阶段函数模板编译:第二阶段不是只使用*ADL吗
- 是否可以获取将根据 ADL 调用的函数的 decltype?
- 为什么 ADL 不能使用 std::get 解析为正确的函数
- 具有 ADL 支持的就地make_unique
- ADL 找不到重载函数
- ADL 在 constexpr 函数中不起作用(仅限 clang)
- 带有 std::function 的 ADL:可以通过 std::function 参数列表中的类型找到采用 std::function 对象的函数吗?
- 候选人期望 6 个参数,提供 0 个
- ADL 失败(或未完成?)具有附加(非推导)模板参数的函数
- 为什么 ADL 不适用于未命名的initializer_list
- 如何在不同命名空间中与候选人拨打ADL的歧义