не конкретизируется при таком использовании
// 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;
};
При конкретизации Queue типом int члены front и back становятся указателями на QueueItem<int>. Следовательно, конкретизированный экземпляр Queue<int> ссылается на экземпляр QueueItem, конкретизированный типом int. Но поскольку соответствующие члены являются указателями, то QueueItem<int> конкретизируется лишь в момент их разыменования в функциях-членах класса Queue<int>.
Содержание Назад Вперед