Определения шаблонов классов 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 |
};