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




.Разрешение имен в шаблонах классов A - часть 3


конкретизируется типом класса LongDouble (см. раздел 16.9), то желательно, чтобы внутри функции-члена remove()в следующем выражении

cout << retval << endl;

вызывался оператор operator<<(),

ассоциированный с классом LongDouble:

#include "Queue.h"

#include "ldouble.h"

// содержит:

// class LongDouble { ... };

// ostream& operator<<( ostream &, const LongDouble & );

int main() {

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

   Queue<LongDouble> *qld = new Queue<LongDouble>;

   // конкретизация Queue<LongDouble>::remove()

   // вызывает оператор вывода для LongDouble

   qld->remove();

   // ...

}

Место в программе, где происходит конкретизация шаблона, называется точкой конкретизации. Она определяет, какие объявления принимаются компилятором во внимание для имен, зависящих от параметров шаблона.

Точка конкретизации шаблона всегда находится в области видимости пространства имен и непосредственно предшествует объявлению или определению, которое ссылается на конкретизированный экземпляр. Точка конкретизации функции-члена или статического члена шаблона класса всегда следует непосредственно за объявлением или определением, которое ссылается на конкретизированный член.

В предыдущем примере точка конкретизации Queue<LongDouble>

находится перед main(), и при разрешении зависящих от параметров имен, которые используются в определении шаблона Queue, компилятор просматривает все объявления до этой точки. Аналогично при таком разрешении в определении remove() компилятор просматривает все объявления до точки конкретизации, расположенной после main().

Как отмечалось в разделе 16.2, шаблон конкретизируется, если он используется в контексте, требующем полного определения класса. Члены шаблона не конкретизируются автоматически вместе с ним, а лишь тогда, когда сами используются в программе. Поэтому точка конкретизации шаблона класса может не совпадать с точками конкретизации его членов, да и сами члены могут конкретизироваться в разных точках. Чтобы избежать ошибок, объявления имен, упоминаемых в определениях шаблона и его членов, рекомендуется помещать в заголовочные файлы, включая их перед первой конкретизацией шаблона класса или любого из его членов.




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