从另一个命名空间内访问C ++全局命名空间

时间:2012-08-08 21:55:39

标签: c++ namespaces operator-overloading scope-resolution

在下面的C ++代码中,首先为单个foobar参数定义double,然后再为Foo类型的单个参数定义one。两者都在全局命名空间中定义。

foobar命名空间内,定义了Bar的进一步重载,其中包含foobar类型的单个参数。在此foobar版本中,对double foobar参数(42.0)的无限制调用将失败。对double的类似调用,这次使用(::)作用域解析运算符限定,也使用foobar参数,但是会成功。

另一方面,对Foo的无条件调用(参数类型为foobar)成功。使用范围解析运算符限定的Foo参数调用struct Foo {}; struct Bar {}; double foobar(double x) { return x; } Foo foobar(Foo f) { return f; } namespace one { Bar foobar(Bar b) { //foobar(42.0); // error: can't convert to Bar ::foobar(42.0); Foo f; foobar(f); // no problem ::foobar(f); return b; } }; 也会成功。

为什么这两种情况的表现不同?我同时使用gcc 4.7和clang ++ 3.2。

{{1}}

1 个答案:

答案 0 :(得分:8)

Argument dependent lookup

在调用foobar(f)中,将考虑来自Foo命名空间的函数。

double不起作用,因为该类型未在任何名称空间中声明。