在C++中,如果我有
namespace myNamespace {
boost::whatever();
}编译器会在boost名称空间或myNamespace::boost中查找什么()吗?
发布于 2014-12-26 06:55:55
问题不是它是否会寻找boost::whatever,而是它将在哪里找到boost本身。
如果您有一个名称为boost的嵌套名称空间定义,它将在声明点隐藏全局boost名称空间。在声明myNamespace::boost之前,全局boost名称空间都是可见的(§3.3.2/2)。
[注意:外部作用域中的名称在声明隐藏它的名称之前仍然可见。[示例:
const int i= 2;{ int ii;}
声明一个包含两个整数的块范围数组。-结束示例]-结束注释]
因此,如果在创建嵌套名称myNamespace::boost之前调用boost::whatever(),它将查找全局boost名称空间。如果您始终希望它在全局名称空间中找到boost,则可以使用::boost限定名称。
发布于 2014-12-26 08:42:34
首先,我认为你的意思是:
namespace myNamespace {
using boost::whatever; // NOT boost::whatever();
}请记住,C++命名空间主要是为了避免命名冲突,而不是一种设计机制,这意味着当您在另一个命名空间中使用其他命名空间的方法时,您只需调用原始方法,并且在新命名空间作用域中没有副本。
发布于 2014-12-26 06:30:19
假设您希望使用某些限定来调用函数,则最终可能会使用本地名称空间,而不是全局名称空间:
#include <iostream>
namespace A { void f() { std::cout << "::A::f()\n"; } }
namespace B {
namespace A { void f() { std::cout << "::B::A::f()\n"; } }
void g() { A::f(); }
void h() { ::A::f(); }
}
int main() {
B::g();
B::h();
}如果您希望确保选择的是特定的名称空间,则需要像在::A::f()中那样使用绝对限定。
https://stackoverflow.com/questions/27651183
复制相似问题