|
using 声明怎样影响重载函数呢using 声明为一个名字空间的成员在该声明出现的域中 提供了一个别名下面程序中的using 声明会怎么样呢 namespace libs_R_us { int max( int, int ); int max( double, double ); extern void print( int ); extern void print( double ); } // using 声明 using libs_R_us::max; using libs_R_us::print( double ); // 错误 void func() { max( 87, 65 ); // 调用 libs_R_us::max( int, int ) max( 35.5, 76.6 ); // 调用 libs_R_us::max( double, double ) } 第一个using 声明向全局域中引入了两个libs_R_us::max()函数于是我们便可以在func() 中调用这两个max()函数函数调用时的实参类型将决定哪个函数会被调用第二个using 声 明是个错误用户不能在using 声明中为一个函数指定参数表对于libs_R_us::pring()惟一有 效的using 声明是 using libs_R_us::print; 如果using 声明向一个域中引入了一个函数而该域中已经存在一个同名的函数又会 怎样呢记住using 声明只是一个声明由using 声明引入的函数就好像在该声明出现的地 方被声明一样因此由using 声明引入的函数重载了在该声明所出现的域中同名函数的其 他声明例如 375 第九章 重载函数 #include <string> namespace libs_R_us { extern void print( int ); extern void print( double ); } extern void print( const string & ); // libs_R_us::print( int ) 和 libs_R_us::print( double ) // 重载 print( const string & ) using libs_R_us::print; void fooBar( int ival ) { print( 'Value: ' ); // 调用全局 print( const string & ) print( ival ); // 调用 libs_R_us::print( int ) } using 声明向全局域中加入了两个声明一个是print(int) 一个是print(double) 这些声 明为名字空间libs_R_us 中的函数提供了别名这些声明被加入到print()的重载函数集合中 它已经包含了全局函数print(const string&) 当fooBar()调用函数时所有的print()函数都将 被考虑
如果using 声明向一个域中引入了一个函数而该域中已经有同名函数且具有相同的参 数表则该using 声明就是错误的如果在全局域中已经存在一个名为print(int)的函数则 using 声明不能为名字空间libs_R_us 中的函数声明别名print(int) 例如 namespace libs_R_us { void print( int ); void print( double ); } void print( int ); using libs_R_us::print; // 错误: print(int) 的重复声明 void fooBar( int ival ) { print( ival ); // 哪一个 print? ::print 还是 libs_R_us::print? }
|