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



Специализации шаблонов классов A - часть 4


Если класс специализируется целиком, лексемы template<>

помещаются только перед определением явной специализации всего шаблона:

#include "QueueLD.h"

// определяет функцию-член min()

// из специализированного шаблона класса

LongDouble Queue<LongDouble>::min() { }

Класс не может в одних файлах конкретизироваться из общего определения шаблона, а в других – из специализированного, если задано одно и то же множество аргументов. Например, специализацию шаблона QueueItem<LongDouble>

необходимо объявлять в каждом файле, где она используется:

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

#include "Queue.h"

void ReadIn( Queue<LongDouble> *pq ) {

   // использование pq->add()

   // приводит к конкретизации QueueItem<LongDouble>

}

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

#include "QueueLD.h"

void ReadIn( Queue<LongDouble> * );

int main() {

   // используется определение специализации для Queue<LongDouble>

   Queue<LongDouble> *qld = new Queue<LongDouble>;

   ReadIn( qld );

   // ...

}

Эта программа некорректна, хотя большинство компиляторов ошибку не обнаружат: заголовочный файл QueueLD.h

следует включать во все файлы, где используется Queue<LongDouble>, причем до первого использования.




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