член класса, конкретизированного из шаблона
// типы возвращаемого значения и обоих параметров конкретизированы из
// шаблона класса Queue
extern Queue< complex<double> >
foo( Queue< complex<double> > &, Queue< complex<double> > & );
// указатель на функцию- член класса, конкретизированного из шаблона Queue
bool (Queue<double>::*pmf)() = 0;
// явное приведение 0 к указателю на экземпляр Queue
Queue<char*> *pqc = static_cast< Queue<char*>* > ( 0 );
Объекты типа класса, конкретизированного по шаблону Queue, объявляются и используются так же, как объекты обычных классов:
extern Queue<double> eqd;
Queue<int> *pqi = new Queue<int>;
Queue<int> aqi[1024];
int main() {
int ix;
if ( ! pqi->is_empty() )
ix = pqi->remove();
// ...
for ( ix = 0; ix < 1024; ++ix )
eqd[ ix ].add( ix );
// ...
}
В объявлении и определении шаблона можно ссылаться как на сам шаблон, так и на конкретизированный по нему класс:
// объявление шаблона функции
template <class Type>
void bar( Queue<Type> &, // ссылается на обобщенный шаблон
Queue<double> & // ссылается на конкретизированный шаблон
)
Однако вне такого определения употребляются только конкретизированные экземпляры. Например, в теле обычной функции всегда надо задавать фактические аргументы шаблона Queue:
void foo( Queue<int> &qi )
{
Queue<int> *pq = &qi;
// ...
}
Шаблон класса конкретизируется только тогда, когда имя полученного экземпляра употребляется в контексте, где требуется определение шаблона. Не всегда определение класса должно быть известно. Например, перед объявлением указателей и ссылок на класс его знать необязательно:
class Matrix;
Matrix *pm; // правильно: определение класса Matrix знать необязательно
void inverse( Matrix & ); // тоже правильно
Поэтому объявление указателей и ссылок на конкретизированный шаблон класса не приводит к его конкретизации. (Отметим, что в некоторых компиляторах, написанных до принятия стандарта C++, шаблон конкретизируется при первом упоминании имени конкретизированного класса в тексте программы.) Так, в функции foo() объявляются указатель и ссылка на Queue<int>, но это не вызывает конкретизации шаблона Queue:
Содержание Назад Вперед