如果代码这样写:
#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;
}
那么我的问题是,如果我没有使用语句,
using namespace std
然后我必须手动提及数据成员以及命名空间作为 std::string(例如),但是如果我在另一个命名空间内使用相同的数据成员(std::string),例如命名空间n1,那么它不会被隐式更改为命名空间n1::std::string吗?
没有 n1::std::string 数据类型,那么它是如何工作的。 n1::std::string 如何转换为::std::string?
但为什么它仍然远离另一个 namespace 内的相对使用。 如果我想在我的代码中使用该概念,我该如何更改代码。 如果将相同的概念用于我自己的库,我该如何进行更改,以利用相同的概念。
最佳答案
在 i1::i2
中,i1 是一个非限定标识符,它与任何其他非限定标识符一样被查找。首先在当前范围内,然后在封闭范围内,直到搜索到全局命名空间。于是用std::string
因为n1
中没有std
,所以找到全局命名空间下的std
.换句话说,在 n1
中,你可以将 ::n2::y
引用为 n2::y
只要你没有n1
中名为 n2
的实体。
如果你想防止 n1::std::string
实体,你必须使用 ::std::string
而不是 std::string
.
关于c++ - 从另一个命名空间访问标准命名空间数据成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48340250/