繁体   English   中英

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

[英]Accessing standard namespaces data members from another namespace

如果代码编写如下:

#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提及(例如),但是如果我在另一个名称空间(例如名称空间n1)中使用相同的数据成员(std :: string),则将它不会隐式更改为名称空间n1 :: std :: string吗?

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

  2. 但是为什么它仍然与另一个名称空间内的相对用法保持距离。 如果我想在代码中使用该概念,该如何更改代码。 如果将相同的概念用于我自己的库,那么我该如何进行更改以使用相同的概念。

i1::i2 ,i1是一个不合格的标识符,并且像其他任何不合格的标识符一样被查找。 首先在当前作用域中,然后在封闭的作用域中,直到搜索全局名称空间。 因此,使用std::string因为n1没有std ,因此找到了全局命名空间下的std 换句话说,在n1 ,你可以参考::n2::yn2::y只要你没有一个实体的命名也n2n1

如果要防止使用n1::std::string实体,则必须使用::std::string而不是std::string

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

在n1内,您可以看到std,因为您可以看到全局名称空间中的所有内容,因此它是隐式:: std

如果在n1内定义一个命名空间std {},那么您将完全不了解当前上下文中的全局命名空间std。 您仍然可以通过“使用”重命名或通过显式:: std来访问它

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM