从另一个命名空间访问标准命名空间数据成员

Posted

技术标签:

【中文标题】从另一个命名空间访问标准命名空间数据成员【英文标题】:Accessing standard namespaces data members from another namespace 【发布时间】:2018-01-19 11:38:13 【问题描述】:

如果代码写成如下:

#include<iostream>

namespace n2    
    int y = 10;


namespace n1    
    int x =  20;
    int m = ::n2::y;

    std::string str;


int main()

    std::cout << n1::x << std::endl;
    std::cout << n2::y << std::endl;

    return 0;

那么我的问题是,如果我没有使用该语句,

使用命名空间标准

然后我必须手动将数据成员与命名空间一起提到为 std::string(例如),但如果我在另一个命名空间内使用相同的数据成员(std::string),例如命名空间n1,那么会不会隐式改成命名空间n1::std::string?

    没有 n1::std::string 数据类型,那么它是如何工作的。 n1::std::string 如何转换为 ::std::string?

    但是为什么它在另一个命名空间内的相对使用中保持冷漠。 如果我想在我的代码中使用这个概念,我该如何更改代码。 如果我自己的库要使用相同的概念,我该如何进行更改,以使用相同的概念。

【问题讨论】:

什么 CMake 文件? 不清楚你在问什么。 我的意思是如果我自己的库使用相同的概念,我如何进行更改,以使用相同的概念。 不要使用using namespace std,问题就会消失 【参考方案1】:

i1::i2 中,i1 是一个非限定标识符,并且会与任何其他非限定标识符一样查找。首先在当前范围内,然后在封闭的范围内,直到搜索全局命名空间。因此,对于std::string,由于n1 中没有std,因此会找到全局命名空间下的std。换句话说,在n1 中,只要n1 中没有名为n2 的实体,就可以将::n2::y 引用为n2::y

如果您想防范n1::std::string 实体,则必须使用::std::string 而不是std::string

【讨论】:

If you want to protect against a n1::std::string type, you'll have to use ::std::string instead of std::string. 。这就是我的问题,没有 n1::std::string 数据类型,那么它是如何工作的。 n1::std::string 如何转换为 ::std::string?【参考方案2】:

在命名空间中,您可以看到该命名空间中的所有内容,以及封闭命名空间中的所有内容,一直到全局命名空间。在这种情况下,命名空间上下文比命名空间关键字具有更广泛的含义。它包括任何上下文,例如类和函数。

从 n1 内部,你可以看到 std,因为你可以看到全局命名空间内的所有内容,所以它隐含为 ::std

如果在 n1 中定义了一个命名空间 std ,那么你会从当前上下文中完全掩盖全局命名空间 std。您仍然可以通过“使用”重命名或显式 ::std

来访问它

【讨论】:

以上是关于从另一个命名空间访问标准命名空间数据成员的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个命名空间而不是全局命名空间定义函数和数据?

C ++:使类及其某些数据成员仅在命名空间中可用

面向对象封装 命名空间 访问修饰符等

namespace 命名空间

c ++由于命名空间导致无法解释的类“尚未声明”错误

Hbase数据结构和shell操作