Программирование >>  Инициализация объектов класса, структура 

1 ... 161 162 163 [ 164 ] 165 166 167 ... 395


ошибка: неправильные объявления специализации отсутствует template<>

PCC max< PCC >( PCC, PCC );

отсутствует список параметров специализации обязательно должен быть список параметров функции:

template<> PCC max< PCC >; Однако здесь можно опускать задание аргументов шаблона, если они выводятся из

правильно: аргумент шаблона const char* выводится из типов параметров

формальных параметров функции:

template<> PCC max( PCC, PCC );

template <class T1, class T2, class T3> T1 sum( T2 op1, T3 op2 );

объявления явных специализаций

ошибка: аргумент шаблона для T1 не может быть выведен; он должен быть задан явно template<> double sum( float, float );

правильно: аргумент для T1 задан явно, T2 и T3 выводятся и оказываются равными floa template<> double sum<double>( float, float );

правильно: все аргументы заданы явно

В следующем примере шаблон функции sum() явно специализирован:

template<> int sum<int,char>( char, char );

Пропуск части template<> в объявлении явной специализации не всегда является ошибкой. Например:

Можно объявлять явную специализацию шаблона функции, не определяя ее. Например,

объявление явной специализации шаблона функции

для функции miax(const char*, const char*) она объявляется так:

template< > PCC max< PCC >( PCC, PCC );

При объявлении или определении явной специализации шаблона функции нельзя опускать слово template и следующую за ним пару скобок <>. Кроме того, в объявлении



обобщенное определение шаблона template <class T>

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

правильно: обгчное объявление функции const char* max( const char*, const char*);

Однако эта инструкция не является специализацией шаблона функции. Здесь просто объявляется обычная функция с типом возвращаемого значения и списком параметров, которые соответствуют полученным при конкретизации шаблона. Объявление обычной функции, являющееся конкретизацией шаблона, не считается ошибкой.

Так почему бы просто не объявить обычную функцию? Как было показано в разделе 10.3, для преобразования фактического аргумента функции, конкретизированной по шаблону, в соответствующий формальный параметр в случае, когда этот аргумент принимает участие в выводе аргумента шаблона, может быть применено лишь ограниченное множество преобразований типов. Точно так же обстоит дело и в ситуации, когда шаблон функции специализируется явно: к фактическим аргументам функции при этом тоже применимо лишь ограниченное множество преобразований. Явные специализации не помогают обойти соответствующие ограничения. Если мы хотим выйти за их пределы, то должны определить обычную функцию вместо специализации шаблона. (В разделе 10.8 этот вопрос рассматривается более подробно; там же показано, как работает разрешение перегруженной функции для вызова, который соответствует как обычной функции, так и экземпляру, конкретизированному из шаблона.)

Явную специализацию можно объявлять даже тогда, когда специализируемый шаблон объявлен, но не определен. В предыдущем примере шаблон функции sum() лишь объявлен к моменту специализации. Хотя определение шаблона не обязательно, объявление все же требуется. То, что sum() - шаблон, должно быть известно до того, как это имя может быть специализировано.

Такое объявление должно быть видимо до его использования в исходном файле.

#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.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;

следующий пример:

Эта программа состоит из двух файлов. В файле File1.C нет объявления явной специализации max(const char*, const char*) . Вместо этого шаблон функции конкретизируется из обобщенного определения. В файле File2.C объявлена явная

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

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



1 ... 161 162 163 [ 164 ] 165 166 167 ... 395

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика