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

时间:2018-01-19 11:38:13

标签: 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 << std::endl;

    return 0;
}

然后我的问题是,如果我没有使用该陈述,

  

使用命名空间std

然后我必须手动提及数据成员以及命名空间为std :: string(例如),但是如果我在另一个命名空间内使用相同的数据成员(std :: string),例如命名空间n1,那么它是否会被隐式更改为命名空间n1 :: std :: string?

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

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

2 个答案:

答案 0 :(得分:2)

i1::i2中,i1是非限定标识符,并且被查找为任何其他非限定标识符。首先在当前范围内,然后在封闭的范围内,直到搜索全局命名空间。因此std::string由于std中没有n1,所以找到了全局命名空间下的std。换句话说,在n1中,只要您在::n2::y中没有名为n2::y的实体,就可以将n2引用为n1

如果您想要防范n1::std::string实体,则必须使用::std::string代替std::string

答案 1 :(得分:1)

在命名空间内,您可以看到该命名空间中的所有内容,以及封闭命名空间中的所有内容,一直到全局命名空间。在这种情况下,名称空间上下文比namespace关键字具有更广泛的含义。它包括任何上下文,例如类和函数。

从n1中,您可以看到std,因为您可以看到全局命名空间中的所有内容,因此它是隐式:: std

如果在n1中你要定义命名空间std {},那么你将完全模糊当前上下文中的全局命名空间std。你仍然可以通过使用&#39;来访问它。重命名或显式:: std

相关问题