问一个关于名字空间的有关问题
问一个关于名字空间的问题
在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,就得写全了。
在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,就得写全了。