C++ 从另一个命名空间访问标准命名空间数据成员
如果代码编写如下:C++ 从另一个命名空间访问标准命名空间数据成员,c++,c++11,cmake,namespaces,C++,C++11,Cmake,Namespaces,如果代码编写如下: #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 <&
#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;
}
#包括
命名空间n2{
int y=10;
}
名称空间n1{
int x=20;
int m=::n2::y;
std::字符串str;
}
int main()
{
std::cout在i1::i2
中,i1是一个非限定标识符,并作为任何其他非限定标识符进行查找。首先在当前范围内,然后在封闭范围内,直到搜索全局名称空间。因此,如果std::string
在n1
中没有std
,则全局名称下的std
可以找到速度。换句话说,在n1
中,只要n1
中没有名为n2
的实体,就可以将:n2::y
引用为n2::y
如果您想针对n1::std::string
实体进行保护,则必须使用::std::string
而不是std::string
,在i1::i2
中,i1是一个非限定标识符,并作为任何其他非限定标识符进行查找。首先在当前范围内,然后在封闭范围内,直到全局名称搜索pace。因此,使用std::string
,由于n1
中没有std
,可以找到全局命名空间下的std
。换句话说,在n1
中,只要n1
中没有名为n2
的实体,就可以将:n2::y
引用为n2::y
如果你想保护一个n1::std::string
实体,你必须使用::std::string
而不是std::string
,从一个名称空间中,你可以看到该名称空间中的所有内容,以及封闭名称空间中的所有内容,一直到全局名称空间。在这种情况下,名称空间上下文有一个比namespace关键字含义更广泛。它包括任何上下文,如类和函数
在n1中,您可以看到std,因为您可以看到全局名称空间中的所有内容,因此它是隐式的::std
如果,在n1中定义一个名称空间std{}然后,您将从当前上下文中完全隐藏该全局命名空间std。您仍然可以通过“使用”重命名或通过显式::std从命名空间中访问它,您可以看到该命名空间中的所有内容,以及封闭命名空间中的所有内容,一直到全局命名空间。在本例中,命名空间context的含义比namespace关键字更广泛。它包括任何上下文,例如类和函数
在n1中,您可以看到std,因为您可以看到全局名称空间中的所有内容,因此它是隐式的::std
如果,在n1中定义一个名称空间std{}然后,您将从当前上下文中完全隐藏全局名称空间std。您仍然可以通过“使用”重命名或通过显式::std什么CMake文件来访问它?不清楚您在问什么。我的意思是,如果相同的概念用于我自己的库,我如何进行更改,以使用相同的概念。不要使用使用命名空间std
问题就会消失。什么是CMake文件?不清楚你在问什么。我的意思是,如果相同的概念用于我自己的库,我如何进行更改,以使用相同的概念。如果你想防止n1::std::strin,不要使用使用命名空间std
问题就会消失g type,您必须使用::std::string而不是std::string。
。这是我的问题,没有n1::std::string数据类型,那么它是如何工作的。n1::std::string是如何转换为::std::string的?如果您想防止n1::std::string类型,您必须使用::std::string而不是std::string。
。这就是我的问题是,没有n1::std::string数据类型,那么它是如何工作的。n1::std::string是如何转换为::std::string的?