//上述,通过函数的实参所属的名空间,可以找到该函数名空间。这对于确定函数候选集有影响,//我们将在每个实参类(及实参的基类)所属的名空间搜索候选函数,//这个空间的所有与被调用函数同名的函数都添加到候选集中,如下例
namespace NS{
class ctest{/* */};voiddisplay(const ctest&){/* */};}
class test_item : public NS::ctest {/* */};intmain(){
test_item item;display(item);return0;}//如上,display函数从哪里来呢?//首先查找本地(main函数内及本文件),之后实参查item,item属于test_item,item就从test_item及//基类中查找,同时,NS中的声明的display也添加到候选集中。
重载与using
//using声明,声明的是一个名字,不是一个特定函数,如下:/*
using NS::print(int); //错误,不能指定参数
using NS::print; //ok,using只是声明个名字
*///当书写声明时,所有版本的函数都引入了当前作用域,故库作者如果选择性发布部分同名函数接口,//可能导致外部调用异常(外部调用一个未显式提供的接口,结果也能用了)//注意:如果using引入的函数和已有的同名且形参一样,using将引发错误//using指示,将名空间成员提升到外层作用域中
namespace lib_us{externvoidprint(int);externvoidprint(double);}//普通声明voidprint(const std::string &);
using namespace lib_us;//此时print的候选集包括了如上的3个printvoidfoo(int a){print("test ok !!");//调用print(const std::string &)print(a);//调用print(int)}//注意:如果此时namespace中的print版本和外部一样,并不出错,使用时指定名空间还是当前作用域就可以
跨越多个namespace函数集
//如果使用多个using指示,则每个名空间的名字都成为候选函数集的一部分,如:
namespace aa{intprint(int);}
namespace bb{doubleprint(double);}
using namespace aa;
using namespace bb;longdoubleprint(longdouble);intmain(){print(1);//调用aa:printprint(1.1);//调用bb:printreturn1;}