从另一个命名空间中C++全局命名空间访问
C++ global namespace access from within another namespace
在下面的C++代码中,首先为单个double
参数定义foobar
,然后再次为类型为 Foo
的单个参数定义。两者都在全局命名空间中定义。
在 one
命名空间中,定义了 foobar
的进一步重载,其中包含 Bar
类型的单个参数。从这个版本的foobar
,使用double
参数(42.0)对foobar
的非限定调用将失败。对foobar
的类似调用,这次限定为(::)作用域解析运算符(也带有 double
参数)将成功。
另一方面,对 foobar
的非限定调用 ,参数类型为 Foo
,成功。使用范围解析运算符限定的 Foo
参数对 foobar
的调用也会成功。
为什么这两种情况的行为不同?我同时使用 gcc 4.7 和 clang++ 3.2。
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;
}
};
参数相关查找。
在调用foobar(f)
将考虑来自 Foo
命名空间的函数。
不适用于double
,因为该类型未在任何命名空间中声明。
相关文章:
- 在命名空间中使用全局命名空间中的函数
- 类与命名空间的全局实例
- 将好友从模板导出到全局命名空间
- Catalina C++:使用<cmath>标头产生错误:全局命名空间中没有名为 'signbit' 的成员
- 将以"_[a-z0-9]"开头和"using"的标识符导入全局命名空间是否定义良
- C++从 std::async 函数读取命名空间中的全局变量标志
- 为什么不允许在全局命名空间处阻止范围?
- 如何在命名空间中声明外部全局,然后定义它?
- 运算符<<依赖于参数的查找不在全局命名空间中查找
- 我可以停止 GCC 将标准库名称包含在全局命名空间中吗?
- 在C 中将全局函数包括在命名空间中
- 为什么在全局范围以及命名空间std中定义了size_t
- 如何处理警告 C4177:#pragma 'float_control' 只能在全局范围或命名空间范围内使用
- "uintmax_t":不是"全局命名空间"的成员
- C++项目中的全局命名空间
- 使用 "::member" 引用全局命名空间有什么用吗?
- 在全局命名空间中重载不依赖于用户定义类型的标准定义类型的运算符是否格式正确?
- 命名空间中的全局变量会导致"undefined reference to"
- 在C 中重新解析命名空间内的全局类型
- 命名空间全局变量丢失值 (C++)