Язык программирования C++. Вводный курс



Явная специализация шаблона А - часть 4


#include <iostream>

#include <cstring>

// обобщенное определение шаблона

template <class T>

   T max( T t1, T t2 ) { /* ... */ }

int main() {

   // конкретизация функции

   // const char* max< const char* >( const char*, const char* );

   const char *p = max( "hello", "world" );

   cout << "p: " << p << endl;

   return 0;

}

// некорректная программа: явная специализация const char *:

// имеет приоритет над обобщенным определением шаблона

typedef const char *PCC;

template<> PCC max< PCC >(PCC s1, PCC s2 ) { /* ... */ }

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

max(const char*, const char*), компилятор выдает сообщение об ошибке.

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

// --------- max.h -------

// обобщенное определение шаблона

template <class Type>

   Type max( Type t1, Type t2 ) { /* ... */ }

// --------- File1.C -------

#include <iostream>

#include "max.h"

void another();

int main() {

   // конкретизация функции

   // const char* max< const char* >( const char*, const char* );

   const char *p = max( "hello", "world" );

   cout << "p: " << p << endl;

   another();

   return 0;

}

// --------- File2.C -------

#include <iostream>

#include <cstring>

#include "max.h"

// явная специализация шаблона для const char*

typedef const char *PCC;

template<> PCC max< PCC >( PCC s1, PCC s2 ) { /* ... */ }

void another() {

   // явная специализация

   // const char* max< const char* >( const char*, const char* );

   const char *p = max( "hi", "again" );

   cout << " p: " << p << endl;

   return 0;

<


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