顶级命名空间中的类的参数依赖查找?

时间:2014-05-12 07:45:12

标签: c++ c++03 argument-dependent-lookup

由于历史原因,我有一个位于顶级命名空间的类。我需要为它定义一个函数,必须使用依赖于参数的查找找到 1 。顶级命名空间是否被视为此类的关联命名空间,还是我必须做一些解决方法?

1 否则使用它的模板可能找不到它,因为模板之后定义的符号仅在ADL找到时才会出现。

2 个答案:

答案 0 :(得分:2)

全局命名空间在这方面并不特别,它就像任何其他命名空间一样工作,因此非常适合您的用例。

Live example 1全局命名空间工作。

Live example 2 ADL实际上是#1工作 1 的原因。

以下是实例的文字:

#include <iostream>

struct X {};

template <class T>
void bar(T t)
{
  foo(t);
}

void foo(X x)
{
  std::cout << "Foo\n";
}

int main()
{
  X x;
  bar(x);
}

1 这会失败,因为ADL无法找到该函数,而正常查找会失败。所以它证明#1真的有效,这要归功于ADL。

答案 1 :(得分:1)

以下是我对标准的看法:

来自[basic.lookup.argdep](2):

  

- 如果T是类类型(包括联合),则其关联的类是:   班级本身;它所属的成员,如果有的话;和它的   直接和间接基类。其关联的命名空间是   最关联的类的最里面的名称空间。

从[basic.namespace](2)(和定义global namespace的3.3.6):

  

翻译单元的最外层声明区域是命名空间;见3.3.6。

所以我没有看到任何从ADL中排除全局命名空间的内容。