问一个关于名字空间的有关问题

问一个关于名字空间的问题
在c++中,我们可以在名字空间之外定义名字空间,现在有以下问题:
namespace   n2{
      calss   a{...};
}
namespace   n1{
    namespace   n2{
                class   a{...};
                a   func(a&,a&);
              }
  //如果在这里定义函数func的话,书上说应该是:
          n2::a   n2::func(a&,a&){....}
}
现在我感到很不解的是,函数n1::n2::func   的返回类型是n1::n2::a,书上说,因为是在名字空间n1中定义n1::n2::func,所以返回类型只写n2::a就行了,编译器会自动加上n1::,我的问题是:现在我也定义了类型n2::a,这样返回类型n2::a是不是也可以被编译器理解为在名字空间n2中定义的类型a,这样n1::n2::a和n2::a是不是会有二义,如果编译器只把返回类型理解为n1::n2::a的话,如果我想把返回类型声明为名字空间
  n2中定义的类a要如何写.

------解决方案--------------------
::n2::a
------解决方案--------------------
可以理解成相对文件路径和绝对文件路径的关系

在n1外,你直接写n2::a是找不到的,除非写n1::n2::a
------解决方案--------------------
::n2::a
一定要加上全局域解析符,否则你引用的将不是你所需要的。
------解决方案--------------------
书上说,因为是在名字空间n1中定义n1::n2::func,所以返回类型只写n2::a就行了,编译器会自动加上n1::

----------------------------------------------
是呀,楼主要理解清楚,是在n1空间内才可以省略写返回类型n1的,出了n1空间使用,当然不能省了n1::。

编译器不会出现2义的,在n1空间里直接使用的n2::a,都是指的n1::n2::a,这时候要想用n1空间外面那个n2空间的a,需要写成::n2::a。出了n1空间,直接使用n2::a,都是指外面那个n2::a,要想用n1::n2::a,就得写全了。