С++ для начинающих




Перегрузка и область видимости * - часть 3


Если using-объявление вводит некоторую функцию в область видимости, в которой уже имеется функция с таким же именем и таким же списком параметров, это считается ошибкой. С помощью using-объявления нельзя задать псевдоним для функции print(int) в пространстве имен 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

}

Мы показали, как связаны using-объявления и перегруженные функции. Теперь рассмотрим особенности применения using-директивы. Using-директива приводит к тому, что члены пространства имен выглядят объявленными вне этого пространства, добавляя их в новую область видимости. Если в этой области уже есть функция с тем же именем, то происходит перегрузка. Например:

#include <string>

namespace libs_R_us {

  extern void print( int );

  extern void print( double );

}

extern void print( const string & );

// using-директива

// print(int), print(double) и print(const string &) - элементы

// одного и того же множества перегруженных функций

using namespace libs_R_us;

void fooBar( int ival )

{

  print( "Value: ");   // вызывает глобальную функцию

                       // print( const string & )

  print( ival );       // вызывает libs_R_us::print( int )

}

Это верно и в том случае, когда есть несколько using-директив. Одноименные функции, являющиеся членами разных пространств, включаются в одно и то множество:

namespace IBM {

  int print( int );

}

namespace Disney {

  double print( double );

}

// using-директива

// формируется множество перегруженных функций из различных

// пространств имен

using namespace IBM;

using namespace Disney;

long double print(long double);

int main() {

  print(1);        // вызывается IBM::print(int)

  print(3.1);      // вызывается Disney::print(double)

  return 0;

}

Множество перегруженных функций с именем print в глобальной области видимости включает функции print(int), print(double) и print(long double). Все они рассматриваются в main() при разрешении перегрузки, хотя первоначально были определены в разных пространствах имен.

Итак, повторим, что перегруженные функции находятся в одной и той же области видимости. В частности, они оказываются там в результате применения using-объявлений и using-директив, делающих доступными имена из других областей.




Содержание  Назад  Вперед