时间:2014.07.01
地点:基地
-----------------------------------------------------------------------------------------
命名空间对函数匹配的影响主要表现在:使用using声明或using指示能将某些函数添加到候选函数集(不同版本)中。
对于接受类类型实参的函数而言,其名字查找是在实参的类所在的命名空间中进行。我们将在实参类以及实参类的基类所属的命名空间中搜寻候选函数。这些命名空间中所有与被调函数同名的函数都将被添加到候选集中,即使其中某些函数在调用语句处不可见。比如:
namespace NS { class Quote{/*......*/}; void Display(const Quote&){/*......*/} }在命名空间NS下,我们定义了一个Quote类和Display函数,该函数接受Quote类类型的参数。
class BulkItem:public NS::Quote { /*......*/ };类BulkItem继承命名空间NS下的类Quote
int main() { BulkItem book1; Display(book1); return 0; }在这里,我们传递给Display的实参是一个类类型BulkItem,于是调用语句的候选函数查找不仅会在调用语句所在的作用域即main()函数中查找,它还会在BulkItem已经其基类Quote所属的命名空间中查找。即在这里表现为命名空间NS中声明的函数Display(const Quote&)也将被添加到候选函数集当中。从而在这里可以正确地调用到Display函数。
-----------------------------------------------------------------------------------------
using NS::print(int); //这样会编译错误,因为using不能声明特定函数 using NS::print; //正确,using在这里只声明一个名字这样之后,该函数的所有版本都将被引入到当前作用域之中。
namespace my_space { extern void print(int); extern void print(double); } //接下来是一个普通的函数声明 void print(const std::string&); //using指示,它将把该命名空间名字提升到外层作用域,并与外层作用域同名不同参的函数重载,比如在这里using指示把名字添加到print调用的候选函数集中 using namespace myspace; //于是现在掉用print函数时有如下候选函数版本 //myspace中的print(int) //myspace中的print(double) //当前域中显式声明的print(const std::string&) void FooBar(int ival) { print("Value: "); //该句会调用全局函数的print(const string&) print(ival); //调用命名空间中的print(int) }注意using声明与using指示的区别:
namespace SpaceOne { int print(int); } namespace SpaceTwo { double print(double); } //使用using指示从不同的命名空间中创建一个重载函数集合 using namespace SpaceOne; using namespace SpaceTwo; //还在当前域中定义一个同名不同参函数 long double print(long double); int main() { print(1); //调用SpaceOne中的print(int) print(2.1); //调用SpaceTwo中的print(double) return 0; }在上面,全局作用域中,函数print的重载集合中包括print(int),print(double)和print(long double),尽管它们的声明位于不同作用域中,但他们都属于mian函数中print调用的候选函数集。
原文地址:http://blog.csdn.net/u012333003/article/details/36190037