用using指示符声明namespace的一点体会
来源:互联网 发布:如何防止sql注入漏洞 编辑:程序博客网 时间:2024/05/17 08:41
以前用C#.NET的时候,没有深究过namespace的用法,最近看C++ Primer中关于namespace的讲解有自己的一点体会:
首先,来看我写的一小段代码:
#include <iostream>
using namespace std;
void doSomething()
{
cout << "doSomething() called" << endl;
}
namespace first
{
void doSomething()
{
cout << "first::second::third::doSomething() called" << endl;
}
namespace second
{
void doSomething()
{
cout << "first::second::doSomething() called" << endl;
}
namespace third
{
void doSomething()
{
cout << "first::second::third::doSomething() called" << endl;
}
}
}
namespace test
{
namespace testInner
{
void func()
{
using namespace first::second::third;
doSomething();
}
}
}
}
int main()
{
test::testInner::func();
return 0;
}
粗看起来,似乎没什么错误,可是编译未能通过,报错:error C2668: 'doSomething' : ambiguous call to overloaded function Error executing cl.exe.
究其原因是因为在函数func()中,语句using namespace first::second::third将命名空间first::second::third下的所有成员定义为first下的的成员,而first::second::third::doSomething()与first::doSomething()重复定义(函数签名相同,未能构成重载)。
为了使程序能编译通过,解决方法之一就是将first::doSomething()删除,比如:
//...原程序不变
namespace first
{
// void doSomething() // 删除此函数
// {
// cout << "first::second::third::doSomething() called" << endl;
// }
namespace second
{
//...main()函数不变
此时再次编译即可通过。那么现在运行结果是什么呢?前面说到,语句using namespace first::second::third将命名空间first::second::third下的所有成员声明为first下的的成员,因而此时first::second::third::doSomething()应覆盖::doSomething(),故结果输出:
first::second::third::doSomething() called
小结:
在如下代码中,using指示符将命名空间namespaceHome::namespace1::...::namespaceN下的成员声明为namespaceHome下的成员,即using指示符所在的命名空间(namespaceHome::namespaceU1::..namespaceUM)与using指示符所声明的命名空间(namespaceHome::namespace1::...::namespaceN)所在的第一个母命名空间下的成员。
namespaceHome
{
namespace1
{
... // N层命名空间
{
namespaceN
{
... // 各成员
}
}
}
namespaceU1
{
... // M层命名空间
{
namespaceUM
{
using namespace1::...::namespaceN;
}
}
}
}
- 用using指示符声明namespace的一点体会
- using 声明和using指示的区别
- 关于using声明和using指示符
- 立此存照(18)[C++]using声明与using指示的区别
- using namespace std的一点用法
- 重载和using声明、using指示
- C++using声明和using指示
- 二 : using声明、using指示用于嵌套命名空间时的作用域
- 二 : using声明、using指示用于嵌套命名空间时的作用域
- 二 : using声明、using指示用于嵌套命名空间时的作用域
- using声明与using指示的区别(在作用域上)
- using声明、using指示用于嵌套命名空间时的作用域
- using指示符
- using指示符
- 一 : using声明、using指示及其作用域详解
- 一 : using声明、using指示及其作用域详解
- 一 : using声明、using指示及其作用域详解
- 命名空间、using声明和using指示【附送彩蛋】
- ASP中实现的类似URLEncode的编码函数及对应解码函数
- STRUTS中显示器(VIEWER)管理
- .NET Compact Framework 中的点对点消息队列
- RegExp
- [Design Pattern]:Prototype
- 用using指示符声明namespace的一点体会
- window cmd命令行中对于空格是敏感的
- 在自定义控件中实现AutoCompleteType
- 蛇行矩阵算法
- 遗传算法入门(连载之十) 神经网络入门(连载预告)
- 关于UTF-8 JBoss,JSP,EJB,MySQL,STRUTS的中文解决方案
- Eclipse+JBoss+MySQL开发环境设置
- 用JBoss Eclipse IDE开发J2EE应用系统
- SWF文件结构大解剖