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




Устоявшие функции - часть 2


namespace libs_R_us {

   int max( int, int );

   double max( double, double );

}

// using-объявление

using libs_R_us::max;

char max( char, char );

void func()

{

   // все три функции max() являются устоявшими

   max( 87, 65 );   // вызывается using libs_R_us::max( int, int )

}

Обратите внимание, что функция-кандидат с несколькими параметрами исключается из числа устоявших, как только выясняется, что один из фактических аргументов не может быть приведен к типу соответствующего формального параметра, пусть даже для всех остальных аргументов такое преобразование существует. В следующем примере функция min(char *, int) исключается из множества устоявших, поскольку нет возможности трансформации типа первого аргумента int в тип соответствующего параметра char *. И это происходит несмотря на то, что второй аргумент точно соответствует второму параметру.

extern double min( double, double );

extern double min( char*, int );

void func()

{

   // одна функция-кандидат min( double, double )

   min( 87, 65 );   // вызывается min( double, double )

}

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

void print( unsigned int );

void print( char* );

void print( char );

int *ip;

class SmallInt { /* ... */ };

SmallInt si;

int main() {

   print( ip );   // ошибка: нет устоявших функций: соответствие не найдено

   print( si );   // ошибка: нет устоявших функций: соответствие не найдено

   return 0;

}




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