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



Конкретизация шаблона класса - часть 3


объявляются указатель и ссылка на Queue<int>, но это не вызывает конкретизации шаблона Queue:

// Queue<int> не конкретизируется при таком использовании в foo()

void foo( Queue<int> &qi )

{

   Queue<int> *pqi = &qi;

   // ...

}

Определение класса необходимо знать, когда определяется объект этого типа. В следующем примере определение obj1

ошибочно: чтобы выделить для него память, компилятору необходимо знать размер класса Matrix:

class Matrix;

Matrix obj1;   // ошибка: класс Matrix не определен

class Matrix { ... };

Matrix obj2;  // правильно

Таким образом, конкретизация происходит тогда, когда определяется объект класса, конкретизированного по этому шаблону. В следующем примере определение объекта qi

приводит к конкретизации шаблона Queue<int>:

Queue<int> qi;   // конкретизируется Queue<int>

Определение Queue<int>

становится известно компилятору именно в этой точке, которая называется точкой конкретизации данного класса.

Если имеется указатель или ссылка на конкретизированный шаблон, то конкретизация также производится в момент обращения к объекту, на который они ссылаются. В определенной выше функции foo() класс Queue<int>

конкретизируется в следующих случаях: когда разыменовывается указатель pqi, когда ссылка qi

используется для получения значения именуемого объекта и когда pqi или qi

употребляются для доступа к членам или функциям-членам этого класса:

void foo( Queue<int> &qi )

{

   Queue<int> *pqi = &qi;

   // Queue<int> конкретизируется в результате вызова функции-члена

   pqi->add( 255 );

   // ...

}

Определение Queue<int>

становится известным компилятору еще до вызова функции-члена add() из foo().

Напомним, что в определении шаблона класса Queue есть также ссылка на шаблон QueueItem:

template <class Type>

class Queue {

public:

   // ...

private:

   QueueItem<Type> *front;

   QueueItem<Type> *back;

<


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