С++ для начинающих


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

};



Содержание раздела