[英]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吗?
没有n1 :: std :: string数据类型,那么它是如何工作的。 n1 :: std :: string如何转换为:: std :: string?
但是为什么它仍然与另一个名称空间内的相对用法保持距离。 如果我想在代码中使用该概念,该如何更改代码。 如果将相同的概念用于我自己的库,那么我该如何进行更改以使用相同的概念。
在i1::i2
,i1是一个不合格的标识符,并且像其他任何不合格的标识符一样被查找。 首先在当前作用域中,然后在封闭的作用域中,直到搜索全局名称空间。 因此,使用std::string
因为n1
没有std
,因此找到了全局命名空间下的std
。 换句话说,在n1
,你可以参考::n2::y
为n2::y
只要你没有一个实体的命名也n2
在n1
。
如果要防止使用n1::std::string
实体,则必须使用::std::string
而不是std::string
。
从一个名称空间中,您可以看到该名称空间中的所有内容,以及包含在该名称空间中的所有内容,一直到全局名称空间。 在这种情况下,名称空间上下文比名称空间关键字具有更广泛的含义。 它包括任何上下文,例如类和函数。
在n1内,您可以看到std,因为您可以看到全局名称空间中的所有内容,因此它是隐式:: std
如果在n1内定义一个命名空间std {},那么您将完全不了解当前上下文中的全局命名空间std。 您仍然可以通过“使用”重命名或通过显式:: std来访问它
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.