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

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

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

#ifndef QUEUE_H

#define QUEUE_H

// объявление QueueItem

template class T class QueueItem;

template class Type

class Queue {

public:

Queue() : front( 0 ), back ( 0 ) { }

~Queue();

Type& remove();

void add( const Type & );

bool is_empty() const {

return front == 0;

}

private:

QueueItemType *front;

QueueItemType *back;

};

#endif

При использовании имени Queue внутри определения шаблона класса Queue список параметров Type можно опускать. Однако пропуск списка параметров шаблона QueueItem в определении шаблона Queue недопустим. Так, объявление члена front является ошибкой:

template class Type

class Queue {

public:

// ...

private:

// ошибка: список параметров для QueueItem неизвестен

QueueItemType *front;

}

Упражнение 16.1

Найдите ошибочные объявления (или пары объявлений) шаблонов классов:

(a) template class Type

class Container1;

template class Type, int size

class Container1;

(b) template class T, U, class V

class Container2;

(c) template class C1, typename C2

class Container3 {};

(d) template typename myT, class myT

class Container4 {};

(e) template class Type, int *pi

class Container5;

(f) template class Type, int val = 0

class Container6;

template class T = complexdouble, int v

class Container6;

Упражнение 16.2

Следующее определение шаблона List некорректно. Как исправить ошибку?

template class elemenType

class ListItem;

template class elemType

class List {

public:

ListelemType()

: _at_front( 0 ), _at_end( 0 ), _current( 0 ), _size( 0 )

{}

ListelemType( const ListelemType & );

ListelemType& operator=( const ListelemType & );

~List();

void insert( ListItem *ptr, elemType value );

int remove( elemType value );

ListItem *find( elemType value );

void display( ostream &os = cout );

int size() { return _size; }

private:

ListItem *_at_front;

ListItem *_at_end;

ListItem *_current;

int _size

};