首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用户命名空间内的命名空间限定名

用户命名空间内的命名空间限定名
EN

Stack Overflow用户
提问于 2014-12-26 06:21:32
回答 3查看 135关注 0票数 1

在C++中,如果我有

代码语言:javascript
复制
namespace myNamespace {
    boost::whatever();
}

编译器会在boost名称空间或myNamespace::boost中查找什么()吗?

EN

回答 3

Stack Overflow用户

发布于 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限定名称。

票数 2
EN

Stack Overflow用户

发布于 2014-12-26 08:42:34

首先,我认为你的意思是:

代码语言:javascript
复制
namespace myNamespace {
     using boost::whatever; // NOT boost::whatever();
}

请记住,C++命名空间主要是为了避免命名冲突,而不是一种设计机制,这意味着当您在另一个命名空间中使用其他命名空间的方法时,您只需调用原始方法,并且在新命名空间作用域中没有副本。

票数 2
EN

Stack Overflow用户

发布于 2014-12-26 06:30:19

假设您希望使用某些限定来调用函数,则最终可能会使用本地名称空间,而不是全局名称空间:

代码语言:javascript
复制
#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()中那样使用绝对限定。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27651183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档