Все перегруженные функции объявляются в одной и той же области видимости. К примеру, локально объявленная функция не перегружает, а просто скрывает глобальную:
#include <string>
void print( const string & );
void print( double ); // перегружает print()
void fooBar( int ival )
{
// отдельная область видимости: скрывает обе реализации print()
extern void print( int );
// ошибка: print( const string & ) не видна в этой области
print( "Value: ");
print( ival ); // правильно: print( int ) видна
}
Поскольку каждый класс определяет собственную область видимости, функции, являющиеся членами двух разных классов, не перегружают друг друга. (Функции-члены класса описываются в главе 13. Разрешение перегрузки для функций-членов класса рассматривается в главе 15.)
Объявлять такие функции разрешается и внутри пространства имен. С каждым из них также связана отдельная область видимости, так что функции, объявленные в разных пространствах, не перегружают друг друга. Например:
#include <string>
namespace IBM {
extern void print( const string & );
extern void print( double ); // перегружает print()
}
namespace Disney {
// отдельная область видимости:
// не перегружает функцию print() из пространства имен IBM
extern void print( int );
}
Использование using-объявлений и using-директив помогает сделать члены пространства имен доступными в других областях видимости. Эти механизмы оказывают определенное влияние на объявления перегруженных функций. (Using-объявления и using-директивы рассматривались в разделе 8.6.)
Каким образом using-объявление сказывается на перегрузке функций? Напомним, что оно вводит псевдоним для члена пространства имен в ту область видимости, в которой это объявление встречается. Что делают такие объявления в следующей программе?
namespace libs_R_us {
int max( int, int );
int max( double, double );
extern void print( int );
extern void print( double );