Это явное создание .
Обычно, когда вы используете шаблон, компилятор генерирует то, что вам нужно, по мере необходимости. Однако для обеспечения основных специализаций шаблона класса в статической или динамической библиотеке вы хотите сгенерировать все элементы одновременно, чтобы убедиться, что они доставлены пользователю.
Например, большинство реализаций стандартной библиотеки C ++ явно специализируются std::ostream<char,char_traits<char> >
, потому что в противном случае приложения могли бы включать повторяющиеся копии различных операций на cout
.
Этот синтаксис идентичен явной реализации. C ++ 03 §14.7.2 / 2:
Синтаксис для явного создания экземпляра:
явной конкретизации:
template
декларация
Edit:
Похоже, вы наткнулись на устаревший синтаксис для , специализирующегося на , а не на явном создании экземпляра шаблона класса. Comeau предупреждает вас, что оно приняло объявление template-id как предварительное объявление явной специализации. Предположительно GCC делает то же самое. Маловероятно, что в этом случае вы получаете явное создание экземпляра. Кроме того, это неопределенное поведение - использовать явную специализацию шаблона до его определения. (По сути, неявная специализация вызывает нарушение правила одного определения.)
Обратите внимание, что GCC также поддерживает extern
создания шаблона:
extern template
декларация
В случае создания экземпляров внешних функций я не удивлюсь, если template
будет необязательным. Но я не удивлюсь, обнаружив, что это требуется, и не пропустив его.