Подтвердить что ты не робот

В чем разница между классом шаблона и шаблоном класса?

В чем разница между классом шаблона и шаблоном класса?

4b9b3361

Ответ 1

Это общая точка путаницы для многих (включая страницу "Общее программирование" в Википедии, некоторые уроки на С++ и другие ответы на этой странице). Что касается С++, нет такой вещи, как "шаблонный класс", существует только "шаблон шаблона".. Способ чтения этой фразы - это "шаблон для класса", в отличие от "шаблона функции", который является "шаблоном для функции". Снова: классы не определяют шаблоны, шаблоны определяют классы (и функции). Например, это шаблон, в частности шаблон класса, но он не класс:

template<typename T> class MyClassTemplate
{ 
    ...
};

Объявление MyClassTemplate<int> - это класс, или педантично, класс, основанный на шаблоне. Не существует специальных свойств класса на основе шаблона и класса, не основанного на шаблоне. Специальные свойства имеют сам шаблон.

Фраза "класс шаблона" ничего не значит, потому что слово "шаблон" не имеет смысла в качестве прилагательного при применении к существительному "класс" в отношении С++. Это подразумевает существование класса, в котором есть (или определяет) шаблон, который не является понятием, которое существует в С++.

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

Ответ 2

Отличие состоит в том, что термин "класс шаблона" просто не существует в стандарте С++. Это термин, используемый в основном людьми, которые считают, что термин "шаблон класса" запутан (например, компании Qt Nokia и ранее Trolltech).

Стандарт не имеет понятия об этом, поэтому для других народов это важно. Некоторые люди используют это синонимом, а другие говорят, что термин "класс шаблона" относится к экземпляру или явно специализированному шаблону класса, что сделает его эквивалентным термину "специализация шаблона шаблона". Исторически это имело это значение. Аннотированное справочное руководство определяет на странице 343

Класс, сгенерированный из шаблона класса, называется классом шаблона, как и класс, специально определенный с именем-шаблоном-шаблоном как его имя

Нетерминальный тип-шаблон-имя эквивалентен нетерминальному шаблону-идентификатору, используемому в сегодняшнем стандарте, и опускается template-name < arguments >.


Чтобы ознакомиться с сегодняшними условиями, что более важно, чем использование сомнительных старых терминов

// (1) defines a class template
template<typename T> class A { }; 

// (2) defines a class template explicit specialization 
template<> class A<int> { };

// (3) defines a class template partial specialization
template<typename T> class A<T*> { };

// (4) explicitly instantiates A<char>. 
template class A<char>;

// (5) implicitly instantiates A<short> (because of the member declaration)
struct D { A<short> a; };
  • ARM называется классом (2) и классами, порожденными (4) и (5) классом шаблона. Я не уверен, знал ли ARM о частичной специализации. Но если так (3) не назывался шаблоном, потому что (3) не определяет класс, а определяет шаблон.
  • Текущий стандарт вызывает класс (2) и те, которые сгенерированы (4) и (5) специализациями шаблонов классов. И (3) называется частичной специализацией, в отличие от явной специализации. Он также иногда вызывает (3) специализацию (3.2/5 - однако с уточняющими перекрестными ссылками), хотя я считаю, что это не совсем понятно для меня, поскольку он определяет "специализацию" как "класс, функцию или класс" член ", который (3) не удовлетворяет.

Ответ 3

Класс шаблона связан с шаблоном шаблоном шаблона шаблона, а шаблон шаблона - это просто класс "заполнение пробелов" шаблон.

Ответ 4

Бьярне Страуструп, создатель С++, говорит в своей книге "Язык программирования С++" 4-е издание, 23.2.1 Определение шаблона:

Есть люди, которые делают семантические различия между шаблонами классов условий и шаблоном. Я не; это было бы слишком тонким: пожалуйста, рассмотрите эти термины взаимозаменяемыми. Аналогично, я рассматриваю шаблон функции взаимозаменяемый с функцией шаблона.

Ответ 5

Класс шаблона: класс, который имеет общее определение или класс с параметрами, которые не создаются, пока информация не предоставлена ​​клиентом. Он ссылается на жаргон для простых шаблонов. Просто класс с шаблоном префикса и использование T. Шаблон класса: индивидуальная конструкция класса определяется шаблоном класса, который почти аналогичен тому, как индивидуальные объекты создаются с использованием класса. Он относится к объекту класса шаблона Ex-classname objectname (список аргументов)

Ответ 6

Шаблон класса - это общий класс для разных типов объектов. В основном он предоставляет спецификацию для генерации классов на основе параметров. Всякий раз, когда создается новый объект, новый класс будет иметь место в памяти для этой цели. Это называется экземпляром шаблона класса, и каждая экземплярная версия класса называется классом шаблона.