从另一个命名空间访问标准命名空间数据成员
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(例如(,但是如果我在另一个命名空间中使用相同的数据成员 (std::string(,例如命名空间 n1,那么它不会被隐式更改为命名空间 n1::std::string?
没有 n1::std::string 数据类型,然后它是如何工作的。n1::std::string如何转换为::std::string?
但是为什么它仍然远离另一个命名空间内的相对使用。如果我想在我的代码中使用该概念,我该如何更改代码。如果相同的概念用于我自己的库,我该如何进行更改,以使用相同的概念。
在i1::i2
中,i1 是一个非限定标识符,并作为任何其他非限定标识符查找。 首先在当前范围内,然后在封闭范围内,直到搜索全局命名空间。 因此,std::string
由于n1
中没有std
,因此可以找到全局命名空间下的std
。 换句话说,在 n1
中,只要n1
中没有名为 n2
的实体,就可以将::n2::y
引用为n2::y
。
如果要防范n1::std::string
实体,则必须使用::std::string
而不是std::string
。
从命名空间中,您可以看到该命名空间中的所有内容,以及封闭命名空间中的所有内容,一直到全局命名空间。在这种情况下,命名空间上下文的含义比命名空间关键字更广泛。它包括任何上下文,例如类和函数。
在 n1 中,您可以看到 std,因为您可以看到全局命名空间中的所有内容,因此它是隐式的 ::std
如果在 n1 中定义命名空间 std {},那么您将完全从当前上下文中隐藏该全局命名空间 std。您仍然可以通过执行"使用"重命名或显式 ::std 来访问它
- 命名空间 std 没有成员any_of
- 为什么 Clang 在命名空间'std'中没有名为 'copy' 的成员给出错误
- Typedef 不是命名空间的成员
- "uintmax_t":不是"全局命名空间"的成员
- 从另一个命名空间访问标准命名空间数据成员
- 使用全局命名空间限定符和指向数据成员的指针
- C++命名空间错误:不是命名空间的成员
- InitializeCriticalSectionEx 不是 atlwinverapi.h 中全局命名空间的成员
- C++:使类及其某些数据成员仅在命名空间中可用
- 在vs2010中使用iostream时,出现错误C2039:'exit':不是"全局命名空间"的成员
- 函数不是全局命名空间的成员
- 不是全局命名空间的成员
- 一个命名空间是否可以是另一个命名空间的成员
- "CreateEvent":不是 ASIO 中"全局命名空间"的成员
- 当外部命名空间具有具有相同名称的成员时,访问未命名命名空间的成员
- Template函数不是命名空间的成员
- c++中的命名空间私有成员
- 编译错误错误 C2039:"clock_t":不是"全局命名空间"的成员
- 如何在用户定义的命名空间的成员函数中引用指针 **environ?
- C2039:类不是命名空间的成员