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




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


// типы возвращаемого значения и обоих параметров конкретизированы из

// шаблона класса 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()




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