здесь должно быть определение шаблона
// здесь должно быть определение шаблона функции max()
// и его специализации для аргументов const char*
int main() {
// вызов конкретизированной функции: int max< int >( int, int );
int i = max( 10, 5 );
// вызов явной специализации:
// const char* max< const char* >( const char*, const char* );
const char *p = max( "hello", "world" );
cout << "i: " << i << " p: " << p << endl;
return 0;
}
Можно объявлять явную специализацию шаблона функции, не определяя ее. Например, для функции max(const char*, const char*) она объявляется так:
// объявление явной специализации шаблона функции
template< > PCC max< PCC >( PCC, PCC );
При объявлении или определении явной специализации шаблона функции нельзя опускать слово template и следующую за ним пару скобок <>. Кроме того, в объявлении специализации обязательно должен быть список параметров функции:
// ошибка: неправильные объявления специализации
// отсутствует template<>
PCC max< PCC >( PCC, PCC );
// отсутствует список параметров
template<> PCC max< PCC >;
Однако здесь можно опускать задание аргументов шаблона, если они выводятся из формальных параметров функции:
// правильно: аргумент шаблона const char* выводится из типов параметров
template<> PCC max( PCC, PCC );
В следующем примере шаблон функции sum() явно специализирован:
template <class T1, class T2, class T3>
T1 sum( T2 op1, T3 op2 );
// объявления явных специализаций
// ошибка: аргумент шаблона для T1 не может быть выведен;
// он должен быть задан явно
template<> double sum( float, float );
// правильно: аргумент для T1 задан явно,
// T2 и T3 выводятся и оказываются равными float
template<> double sum<double>( float, float );
// правильно: все аргументы заданы явно
template<> int sum<int,char>( char, char );
Пропуск части template<> в объявлении явной специализации не всегда является ошибкой. Например:
Содержание Назад Вперед