名字空间探讨!

jn989 jn989 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
前两天看Sutter的Exceptional C++时,遇到一个有关名字空间问题,不甚明白,发上来问问大家:
书中有个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 )
}

欢迎大家指教,谢谢!
...全文

相关推荐

评论 10
收藏 已收藏
分享
返回顶部
jn989
C++ 语言 65,214 成员 250,514 内容