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

1 ... 257 258 259 [ 260 ] 261 262 263 ... 395


template <class Type> class QueueItem {

public:

...

private:

Type представляет тип члена Type item; QueueItem *next;

В этом примере Type используется для обозначения типа члена item. По ходу выполнения программы вместо Type могут быть подставлены различные встроенные или определенные пользователем типы. Такой процесс подстановки называется конкретизацией шаблона.

Имя параметра шаблона можно употреблять после его объявления и до конца объявления или определения шаблона. Если в глобальной области видимости объявлена переменная с таким же именем, как у параметра шаблона, то это имя будет скрыто. В следующем

typedef double Type;

template <class Type> class QueueItem { public:

... private:

тип Item - не double Type item;

QueueItem *next; нримере тин item равен не double, а тину параметра:

template <class Type> class QueueItem {

public: ...

private:

ошибка: член не может иметь то же имя, что и параметр шаблона Type

typedef double Type; Type item;

QueueItem *next;

Член класса внутри определения шаблона не может быть одноименным его параметру: };

Имя параметра шаблона может встречаться в списке только один раз. Поэтому следующее объявление компилятор помечает как ошибку:



правильно: повторное использование имени Type в разн1х шаблонах template <class Type> class QueueItem;

template <class Type>

шаблонов:

class Queue;

Имена параметров в опережающем объявлении и последующем определении одного и того же шаблона не обязаны совпадать. Например, все эти объявления QueueItem

все три объявления QueueItem относятся к одному и тому же шаблону класса

объявления шаблона template <class T> class QueueItem; template <class U> class QueueItem;

фактическое определение шаблона template <class Type>

относятся к одному шаблону класса:

class QueueItem { ... };

У параметров могут быть аргументы по умолчанию (это справедливо как для параметров-типов, так и для параметров-констант) - тип или значение, которые используются в том случае, когда при конкретизации шаблона фактический аргумент не указан. В качестве такого аргумента следует выбирать тип или значение, подходящее для большинства конкретизаций. Например, если при конкретизации шаблона класса Buffer не указан

template <class Type, size = 1024>

размер буфера, то по умолчанию принимается 1024:

class Buffer;

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

template <class Type, size = 1024>

правее (даже в другом объявлении того же шаблона):

i class Buffer;

ошибка: неправильное использование имени параметра шаблона Type template <class Type, class Type>

class container;

Такое имя разрешается повторно использовать в объявлениях или определениях других



template <class Type> class QueueItem { public:

QueueItem( const Type & ); private: Type item; QueueItem *next;

определения шаблона QueueItem: };

Обратите внимание, что каждое появление имени QueueItem в определении шаблона -это сокращенная запись для

QueueItem<Type>

Такую сокращенную нотацию можно употреблять только внутри определения QueueItem (и, как мы покажем в следующих разделах, в определениях его членов, которые находятся вне определения шаблона класса). Если QueueItem применяется как спецификатор тина в определении какого-либо другого шаблона, то необходимо задавать полный список параметров. В следующем примере шаблон класса используется в определении шаблона функции display. Здесь за именем шаблона класса QueueItem должны идти параметры,

template <class Type> void display( QueueItem<Type> &qi ) {

QueueItem<Type> *pqi = &qi;

...

т.е. QueueItem<Type>.

16.1.1. Определения шаблонов классов Queue и QueueItem

Ниже представлено определение шаблона класса Queue. Оно помещено в заголовочный файл Queue.h вместе с определением шаблона QueueItem:

правильно: рассматриваются аргументы по умолчанию из обоих объявлений template <class Type=string, int size>

class Buffer;

(Отметим, что аргументы по умолчанию для параметров шаблонов не поддерживаются в компиляторах, реализованных до принятия стандарта C++. Чтобы примеры из этой книги, в частности из главы 12, компилировались большинством современных компиляторов, мы не использовали такие аргументы.)

Внутри определения шаблона его имя можно применять как спецификатор типа всюду, где допустимо употребление имени обычного класса. Вот более полная версия



1 ... 257 258 259 [ 260 ] 261 262 263 ... 395

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