从另一个命名空间访问标准命名空间数据成员

Accessing standard namespaces data members from another namespace

本文关键字:命名空间 数据成员 标准 访问 另一个      更新时间:2023-10-16

如果代码编写如下:

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

  1. 没有 n1::std::string 数据类型,然后它是如何工作的。n1::std::string如何转换为::std::string?

  2. 但是为什么它仍然远离另一个命名空间内的相对使用。如果我想在我的代码中使用该概念,我该如何更改代码。如果相同的概念用于我自己的库,我该如何进行更改,以使用相同的概念。

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 来访问它