некорректная программа: явная специализация const
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"
Содержание Назад Вперед
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий