Что делает ключевое слово "template" перед ключевым словом "class"? - PullRequest
7 голосов
/ 24 апреля 2011

Просто пример кода [Не пример из реальной жизни]

// at file scope

template <typename T, typename U>
struct demo{};  
template class demo<int, int>; // is the template keyword optional here?

Является ли ключевое слово шаблона необязательным в строке 3? Я не видел (часто) такого использования ключевого слова template ранее. Какая часть стандарта говорит, что это позволяет?

РЕДАКТИРОВАТЬ

Я думаю, что в g ++ есть ошибка.

template <typename T, typename U>
struct demo{};  
class demo<int, int>; // template keyword omitted

компилируется на g ++ (4.5.1), а на Comeau

"ComeauTest.c", line 5: error: specializing class "demo<int, int>" without
          "template<>" syntax is nonstandard
      class demo<int, int>; 

1 Ответ

13 голосов
/ 24 апреля 2011

Это явное создание .

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

Например, большинство реализаций стандартной библиотеки 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 будет необязательным. Но я не удивлюсь, обнаружив, что это требуется, и не пропустив его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...