16.8.3. Явные объявления конкретизации

16.8.3. Явные объявления конкретизации

При использовании модели с включением определение члена шаблона класса помещается в каждый исходный файл, где может употребляться конкретизированный экземпляр. Точно неизвестно, где и когда компилятор конкретизирует такое определение, и некоторые компиляторы (особенно более старые) конкретизируют определение члена данным множеством аргументов шаблона неоднократно. Для использования в программе (на этапе сборки или на одной из предшествующих ей стадий) выбирается один из полученных экземпляров, а остальные игнорируются.

Результат работы программы не зависит от того, сколько раз конкретизировался шаблон: в конечном итоге употребляется лишь один экземпляр. Однако, если приложение состоит из большого числа файлов и некоторый шаблон конкретизируется в каждом из них, то время компиляции заметно возрастает.

Подобные проблемы, характерные для старых компиляторов, затрудняли использование шаблонов. Чтобы помочь программисту управлять моментом, когда конкретизация происходит, в стандарте C++ введено понятие явного объявления конкретизации, где за ключевым словом template идет слово class и имя конкретизируемого шаблона класса.

В следующем примере явно объявляется конкретизация шаблона Queueint, в котором запрашивается конкретизация аргументом int шаблона класса Queue:

#include "Queue.h"

// явное объявление конкретизации

template class Queueint;

Если шаблон класса конкретизируется явно, то явно конкретизируются и все его члены, причем тем же типом аргумента. Следовательно, в файле, где встречается явное объявление, должно присутствовать не только определение шаблона, но и определения всех его членов. В противном случае выдается сообщение об ошибке:

template class Type

class Queue;

// ошибка: шаблон Queue и его члены не определены

template class Queueint;

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

Здесь, как и при использовании шаблонов функций (см. раздел 10.5.3), необходимо применить опцию компилятора, подавляющую неявные конкретизации. Эта опция вынуждает компилятор предполагать, что все конкретизации шаблонов будут объявляться явно.

Упражнение 16.9

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

Упражнение 16.10

Имеется шаблон класса Screen, разработанный в упражнениях из предыдущих разделов (в том числе функции-члены, определенные в упражнении 16.5 из раздела 16.3, и статические члены, определенные в упражнении 16.7 из раздела 16.5). Организуйте программу так, чтобы воспользоваться преимуществами модели компиляции с разделением.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Объявления

Из книги Давайте создадим компилятор! автора Креншоу Джек


6.4.3. Явные критерии

Из книги Справочное руководство по C++ автора Страустрап Бьярн

6.4.3. Явные критерии Перед использованием этих расширений, они должны быть загружены явно, с помощью ключа -m или –match. Так, например, если мы собираемся использовать критерии state, то мы должны явно указать это в строке правила: -m state левее используемого критерия. Некоторые из


R.5.2.3 Явные преобразования типа

Из книги Основы объектно-ориентированного программирования автора Мейер Бертран

R.5.2.3 Явные преобразования типа Конструкция имя-простого-типа (§R.7.1.6), за которой следует список-выражений в скобках образует значение указанного типа с учетом списка выражений. Если список выражений содержит более одного значения, тип должен быть классом с конструктором,


Явные интерфейсы

Из книги Программирование на языке Ruby [Идеология языка, теория и практика применения] автора Фултон Хэл

Явные интерфейсы Четвертое правило является еще одним шагом к укреплению тоталитарного режима в обществе модулей: требуется не только, чтобы любые переговоры ограничивались лишь несколькими участниками и были немногословными; необходимо, чтобы такие переговоры были


5.15. Явные и неявные преобразования чисел

Из книги Язык программирования Си для персонального компьютера автора Бочков C. О.

5.15. Явные и неявные преобразования чисел Программисты, только начинающие изучать Ruby, часто удивляются, зачем нужны два метода to_i и to_int (и аналогичные им to_f и to_flt). В общем случае метод с коротким именем применяется для явных преобразований, а метод с длинным именем — для


Объявления

Из книги C++ для начинающих автора Липпман Стенли

Объявления Объявление - это оператор, сообщающий компилятору VBA о ваших намерениях по поводу использования в программе именованного объекта (переменной, константы, пользовательского типа данных или процедуры). Кроме того, объявление задает тип объекта и обеспечивает


Явные объявления приветствуются

Из книги автора

Явные объявления приветствуются Независимо от того, решите вы назначать конкретные типы данных переменным или нет, каждую переменную перед использованием следует объявить. Как серьезный программист, вы можете сделать так, чтобы VBA заставлял вас объявлять переменные.


ОБЪЯВЛЕНИЯ

Из книги автора

ОБЪЯВЛЕНИЯ В этом разделе описываются формат и составные части объявлений переменных, функций и типов. В разделе 2.1 были введены понятия объявления и определения. Далее по тексту будем для краткости называть и объявления, и определения "объявлениями", если явно не


Явные преобразования типов

Из книги автора

Явные преобразования типов Явное преобразование типа может быть выполнено посредством операции приведения типа. Она имеет следующую синтаксическую форму(<абстрактное-имя-типа>) <операнд><абстрактное-имя-типа> — специфицирует некоторый тип; <операнд> —


8.2.1. Объявления и определения

Из книги автора

8.2.1. Объявления и определения Как было сказано в главе 7, объявление функции устанавливает ее имя, а также тип возвращаемого значения и список параметров. Определение функции, помимо этой информации, задает еще и тело – набор инструкций, заключенных в фигурные скобки.


8.6.2. Using-объявления

Из книги автора

8.6.2. Using-объявления Имеется механизм, позволяющий обращаться к членам пространства имен, используя их имена без квалификатора, т.е. без префикса namespace_name::. Для этого применяются using-объявления.Using-объявление начинается ключевым словом using, за которым следует


10.5.3. Явные объявления конкретизации

Из книги автора

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