Учебник по Visual C++ .Net



             

Шаблоны STL — это библиотека шаблонов - часть 2


int operator >(Man& m) { return m__Age > m. m_Age; }

Если в той же внешней функции встретится оператор:

cout « "\n max (10,011) = " « max (10,011);

то компилятор в другой копии функции max, сгенерированной по тому же шаблону, использует операцию >, определенную для стандартного типа данных int. Один раз написав шаблон функции max, мы можем вызывать ее для всех типов данных, для которых определена операция operator> (). Если для какого-то типа

данных тело функции max не годится, то можно отменить (override) действие шаблона функции для этого типа. Например, определив функцию:

char* max (char* s, char *t)

{

return (strcmp (s, t) >0) ?s : t;

}

мы отменяем действие шаблона для символьных строк, так как функция, скроенная по шаблону, осуществляла бы ничего не значащее сравнение указателей s и t. При использовании шаблона следует строго соблюдать типы параметров и не надеяться на стандартные преобразования типов, по умолчанию осуществляемые компилятором при вызове обычных функций. Например, явно заданную функцию, скрывающую (отменяющую) шаблон:

double max (double, double);

можно вызывать с аргументами (int, double) или (float, long). Компилятор при этом автоматически преобразует параметры к типу double. Однако если явная декларация функции, скрывающей шаблон, отсутствует, то шаблон

template <class T> T max(Т х, Т у)

не позволит смешивать типы при вызове функции max. Таким образом, обращение int i=max (9, 8.); вызывает сообщение об ошибке: "Could not find a match for max (int, double) ", которое означает, что не найдена функция max () для пары аргументов типа (int, double).




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