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的?