15.3.3 名称空间嵌套
一个名称空间可以定义在另一个名称空间内,以单层嵌套为例,要访问内部名称空间中的实体,必须采用“外部名称空间:内部名称空间:实体名”的形式,如果是多层嵌套,还要多次使用作用域限定符,如示例代码15.10所示。
代码15.10 名称空间的嵌套MultiLevelNamespace
<————————————-文件名:example1510.cpp—————————————-> 01 #include<iostream> 02 using namespace std; 03 extern int num=0;//定义性声明外部变量 04 namespace A//创建名称空间A 05 { 06 int num=1;//A中声明的num 07 namespace B 08 { 09 int num=2;//B中声明的num 10 void disp() 11 { 12 cout<<"嵌套类B中的num:"<<num<<endl; 13 cout<<"嵌套类A中的num:"<<A:num<<endl; 14 cout<<"外部全局变量num:"<<:num<<endl; 15 } 16 } 17 } 18 int main() 19 { 20 A:B:disp();//双重限定符 21 return 0; 22 }
输出结果如下所示。
嵌套类B中的num:2 嵌套类A中的num:1 外部全局变量num:0
【代码解析】代码第7行的名称空间B定义在名称空间A中,所以B的可见域为从其定义位置开始,到名称空间A结束。因此,如果要在其他名称空间、其他函数或全局空间中访问名称空间B,必须像使用A中实体一样使用诸如“A:B”的作用域限定形式。
从示例代码15.10中可以看出,嵌套名称空间中的创建或声明的实体屏蔽了外部空间中的实体,在B中要访问A类中的num,也要采用A:num的形式。