命名空间限定名称INSIDE用户命名空间

时间:2014-12-25 22:21:32

标签: c++

在C ++中,如果我有

namespace myNamespace {
    boost::whatever();
}

编译器会在boost命名空间或myNamespace :: boost中查找()?

3 个答案:

答案 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()中的绝对资格。