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


.Частичные специализации шаблонов классов A - часть 2


Частичная специализация шаблона класса неявно конкретизируется при использовании в программе. В следующем примере частичная специализация конкретизируется аргументом шаблона 24

вместо hi:

Screen<24,80> hp2621;

Обратите внимание, что экземпляр Screen<24,80>

может быть конкретизирован не только из частично специализированного, но и из общего шаблона. Почему же тогда компилятор остановился именно на частичной специализации? Если для шаблона класса объявлены частичные специализации, компилятор выбирает то определение, которое является наиболее специализированным для заданных аргументов. Если же ни одно из них не подходит, используется общее определение шаблона. Например, при конкретизации экземпляра Screen<40,132>  соответствующей аргументам шаблона специализации нет. Наш вариант применяется только для конкретизации типа Screen с 80 колонками.

Определение частичной специализации не связано с определением общего шаблона. У него может быть совершенно другой набор членов, а также собственные определения функций-членов, статических членов и вложенных типов. Содержащиеся в общем шаблоне определения членов никогда не употребляются для конкретизации членов его частичной специализации. Например, для частичной специализации Screen<hi,80>

должен быть определен свой конструктор:

// конструктор для частичной специализации Screen<hi,80>

template <int hi>

Screen<hi,80>::Screen() : _height( hi ), _cursor( 0 ),

                          _screen( hi * 80, bk )

                        { }

Если для конкретизации некоторого класса применяется частичная специализация, то определение конструктора из общего шаблона не используется даже тогда, когда определение конструктора Screen<hi,80>

отсутствует.




Начало  Назад  Вперед



Книжный магазин