在C ++中,如果我有
namespace myNamespace {
boost::whatever();
}
编译器会在boost命名空间或myNamespace :: boost中查找()?
答案 0 :(得分:2)
问题不在于它是否会寻找boost::whatever
,而在于它会找到boost
本身。
如果您有一个名为boost
的嵌套命名空间定义,它将在声明点隐藏全局boost
命名空间。全局boost
命名空间将一直显示,直到myNamespace::boost
被声明为止(§3.3.2/ 2)。
[注意:在隐藏它的名称声明之前,外部作用域的名称仍然可见。 [例如:
const int i = 2; { int i[i]; }
声明一个包含两个整数的块范围数组。 - 结束例子] - 结束注释]
因此,如果您在创建嵌套名称boost::whatever()
之前调用myNamespace::boost
,它将查找全局boost
命名空间。如果您始终希望在全局命名空间中找到::boost
,则可以使用boost
限定名称。
答案 1 :(得分:2)
首先,我认为你的意思是:
namespace myNamespace {
using boost::whatever; // NOT boost::whatever();
}
请记住,C ++命名空间主要是为了避免命名冲突而不是设计机制,这意味着当您在另一个命名空间中使用其他命名空间的方法时,您只需调用原始命名空间,并且新命名空间范围内没有副本。因此,当您致电myNamespace::whatever()
时,编译器会选择boost::whatever()
而不是myNamespace::boost::whatever()
,因为boost
内没有声明myNamespace
名称空间。
有关命名空间的更多详细信息,您可以看到: http://en.cppreference.com/w/cpp/language/namespace
答案 2 :(得分:1)
假设您想使用某种限定条件调用函数,您可能最终使用本地命名空间而不是全局命名空间:
#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()
中的绝对资格。