Язык программирования 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;

<


Начало  Назад  Вперед