Определения шаблонов классов 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:
QueueItem<Type> *front;
QueueItem<Type> *back;
};
#endif
При использовании имени Queue внутри определения шаблона класса Queue список параметров <Type> можно опускать. Однако пропуск списка параметров шаблона QueueItem в определении шаблона Queue недопустим. Так, объявление члена front является ошибкой:
template <class Type>
class Queue {
public:
// ...
private:
// ошибка: список параметров для QueueItem неизвестен
QueueItem<Type> *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 = complex<double>, int v>
class Container6;
Упражнение 16.2
Следующее определение шаблона List некорректно. Как исправить ошибку?
template <class elemenType>
class ListItem;
template <class elemType>
class List {
public:
List<elemType>()
: _at_front( 0 ), _at_end( 0 ), _current( 0 ), _size( 0 )
{}
List<elemType>( const List<elemType> & );
List<elemType>& operator=( const List<elemType> & );
~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
};