名字空间探讨!
前两天看Sutter的Exceptional C++时,遇到一个有关名字空间问题,不甚明白,发上来问问大家:
书中有个Myers Example的例子:
有关命名空间的问题我也知道了一些(primer 3版中有关名字空间的部分),但这里f(parm)函数调用怎么就二义性了呢?我知道C++中有这样一个名字查找规则--"如果在声明函数的参数时使用了一个类,那么在查找匹配的函数名字时,编译器会在包含参数类型的名字空间中也进行查找"。所以在解释f(parm)时,肯定会检查parm所在的空间NS的,再根据嵌套名字空间的隐藏原则,NS::f应该隐藏掉全局的void f(NS::T)啊!为什么就二义了呢?我理解的是main中的f(parm)是把NS空间当成局部空间解释的,就好像在main中自己定义的一样,这样的话不就隐藏了全局的f了吗?像下面一样:
欢迎大家指教,谢谢!
书中有个Myers Example的例子:
namespace NS {
class T {};//typically from some header T.h
void f(T);
}
void f(NS::T);
int main()
{
NS::T parm;
f(parm);//ambiguous:NS::f or global f?
}
有关命名空间的问题我也知道了一些(primer 3版中有关名字空间的部分),但这里f(parm)函数调用怎么就二义性了呢?我知道C++中有这样一个名字查找规则--"如果在声明函数的参数时使用了一个类,那么在查找匹配的函数名字时,编译器会在包含参数类型的名字空间中也进行查找"。所以在解释f(parm)时,肯定会检查parm所在的空间NS的,再根据嵌套名字空间的隐藏原则,NS::f应该隐藏掉全局的void f(NS::T)啊!为什么就二义了呢?我理解的是main中的f(parm)是把NS空间当成局部空间解释的,就好像在main中自己定义的一样,这样的话不就隐藏了全局的f了吗?像下面一样:
char* format( int );
void g()
{// 全局函数format( int ) 被隐藏
char* format( double );
char* format( char* );
format(3); // 只有一个可行函数: format( double )
}
欢迎大家指教,谢谢!
...全文
相关推荐
(X)HTML高级教程.pdf
(X)HTML高级教程.pdf
xhtml
让你轻松学好xhtml
用web标准设计网站
循序渐进篇WORD版
DIV+CSS布局大全
DIV+CSS布局大全,全面介绍了div和css的使用,相信对学习者有很大帮助。
C++名字空间/C++命名空间
0、序言 名字空间是C++提供的一种解决符号名字冲突的方法。 一个命令空间是一个作用域,在不同名字空间中命名相同的符号代表不同的实体。 通常,利用定义名字空间的办法,可以使模块划分更加方便,减少模块间的相互影响。 1、名字空间的成员 定义在名字空间中的实体称为名字空间的成员。 名字空间内的名字可以被该名字空间内的其他成员直接访问,名字空间外的代码必须指定该名字位于哪个名字空间。 一个名字空间可以包含多种类型的标识符,如下面所列: 变量、常量、函数、结构体/联合体/枚举、类、嵌套名字空间 名字空间成员的引用方法如下: namespace


