Язык программирования C++. Вводный курс




Шаблоны-члены - часть 4


template <class T>

class Queue {

   // ...

public:

   // шаблон-член конструктора

   template <class Iter>

   Queue( Iter first, Iter last )

        : front( 0 ), back( 0 )

   {

      for ( ; first != last; ++first )

          add( * first );

   }

};

Такой конструктор позволяет инициализировать очередь содержимым другого контейнера. У  контейнерных типов из стандартной библиотеки C++ также есть предназначенные для этой цели конструкторы в виде шаблонов-членов. Кстати, в первом (в данном разделе) определении функции main() использовался конструктор-шаблон для вектора:

vector<int> vi( ai, ai + 4 );

Это определение конкретизирует шаблон конструктора для контейнера vector<int>

типом int*, что позволяет инициализировать вектор содержимым массива элементов типа int.

Шаблон-член, как и обычные члены, может быть определен вне определения объемлющего класса или шаблона класса. Так, являющиеся членами шаблон класса CL или шаблон функции assign()

могут быть следующим образом определены вне шаблона Queue:

template <class T>

class Queue {

private:

   template <class Type> class CL;

   // ...

public:

   template <class Iter>

      void assign( Iter first, Iter last );

   // ...

};

template <class T> template <class Type>

   class Queue<T>::CL<Type>

{

   Type member;

   T mem;

};

template <class T> template <class Iter>

   void Queue<T>::assign( Iter first, Iter last )

{

   while ( ! is_empty() )

      remove();

   for ( ; first != last; ++first )

      add( *first );

}

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

(члена шаблона класса Queue) начинается с

template <class T> template <class Iter>

Первый список параметров шаблона template <class T> относится к шаблону класса Queue. Второй – к самому шаблону-члену assign(). Имена параметров не обязаны совпадать с теми, которые указаны внутри определения объемлющего шаблона класса. Приведенная инструкция по-прежнему определяет шаблон-член assign():

template <class TT> template <class IterType>

void Queue<TT>::assign( IterType first, IterType last )

{ ... }




Содержание  Назад  Вперед