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




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


/p>

}

Вызываемая из assign()

функция add() – это функция-член Queue<Type>::add(). Если Queue

конкретизируется типом int, то у add()

будет следующий прототип:

void Queue<int>::add( const int &val );

Аргумент *first

должен иметь тип int

либо тип, которым можно инициализировать параметр-ссылку на const int. Преобразования типов допустимы. Например, если воспользоваться классом SmallInt из раздела 15.9, то содержимое контейнера, в котором хранятся элементы типа SmallInt, с помощью шаблона-члена assign()

помещается в очередь типа Queue<int>. Это возможно потому, что в классе SmallInt имеется конвертер для приведения SmallInt к int:

class SmallInt {

public:

   SmallInt( int ival = 0 ) : value( ival ) { }

   // конвертер: SmallInt ==> int

   operator int() { return value; }

   // ...

private:

   int value;

};

int main()

{

   // конкретизация Queue<int>

   Queue<int> qi;

   vector<SmallInt> vsi;

   // заполнить вектор

   // конкретизация

   // Queue<int>::assign( vector<SmallInt>::iterator,

   //                     vector<SmallInt>::iterator )

   qi.assign( vsi.begin(), vsi.end() );

   list<int*> lpi;

   // заполнить список

   // ошибка при конкретизации шаблона-члена assign():

   // нет преобразования из int* в int

   qi.assign( lpi.begin(), lpi.end() );

}

Первая конкретизация assign()

правильна, так как существует неявное преобразование из типа SmallInt в тип int и, следовательно, обращение к add() корректно. Вторая же конкретизация ошибочна: объект типа int* не может инициализировать ссылку на тип const int, поэтому вызвать функцию add() невозможно.

Для контейнерных типов из стандартной библиотеки C++ имеется функция assign(), которая ведет себя так же, как функция-шаблон assign() для нашего класса Queue.

Любую функцию-член можно задать в виде шаблона. Это относится, в частности, к конструктору. Например, для шаблона класса Queue его можно определить следующим образом:




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