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


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

8 74
c++

8 ответов:

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

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

декларации MyClassTemplate<int> - это класс, или педантично, класс, основанный на шаблоне. нет никаких специальных свойств класса, основанного на шаблоне, по сравнению с классом, не основанным на шаблоне. специальные свойства шаблона сам.

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

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

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

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

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

не-терминала template-class-name эквивалентно нетерминальному template-id используется в сегодняшнем стандарте и спускается 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) a шаблон класса. Я не уверен, что рука уже знала о частичных специализациях. Но если это так (3) не был вызван класс шаблона, потому что (3) не определяет a класс, но определяет шаблон.
  • текущий стандартный класс вызовов (2), а также те, которые генерируются (4) и (5)специализации шаблона класса. И (3) называется a частичная специализация, а не явной специализации. Он также иногда называет (3) специализацией (3.2/5 - однако с прояснением перекрестных ссылок), хотя я нахожу, что это не совсем ясно для меня, поскольку он определяет "специализацию" как " класс, функция или член класса", который (3) не удовлетворяет.

класс шаблона связан с шаблон метода Дизайн Шаблон, в то время как шаблон класса-это просто шаблон класса "заполнить пробелы".

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

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

шаблон класса-это шаблон, который используется для создания классов, в то время как класс шаблона-это класс, созданный шаблоном.

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

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

посмотри эта статья (из wg21 и была опубликована в 1992 году):

Единообразную Терминологию

большая часть аргументов и разногласий до настоящего времени касалась терминологии, используемой в главе, описывающей шаблоны. Наиболее частым было различное применение '' и 'template-function' для выражения различных идей и намерений. Поскольку нет последовательного именования примененный, результат-путаница и аргумент.

для целей настоящего документа, в качестве предложения для официального принятия комитетом при обсуждении шаблонов и в целях уточнения документации; я предлагаю принять формализацию, которая трейлинг '- template' описывает набор типов или функций, описанных в шаблоне. И что ведущий 'шаблон', используется для описания шаблонного определения части a '- template', например,'template-member-function'. Таким образом :-

  • '': набор функций, описываемых шаблоном, параметрическим на некотором типе информации, предоставленной в качестве аргумента к этому шаблону. Например :-
template<class T> int nullcheck( T* pT )
{ return ( pT != 0 ); }
  • 'class-template': набор классов, описываемых шаблоном, параметрическим на некотором типе информации, предоставленной в качестве аргумента к этому шаблону. Для Пример : -
template<class T> class S {
int i;
public:
int sep_member();
int imm_member()
{ return 2; }
}
  • 'template-function': этот термин больше не допускаются.**
  • 'template-class': этот термин не допускается.**

  • 'member-function-template': этот термин не разрешен, так как он описывает свойство, которое в настоящее время не поддерживается определением шаблона. С помощью выше терминологической конвенции, это было бы опишите элемент неклассового шаблона, определение которого само по себе было a шаблон. Например :-

class Normal { public:
template<class T> int foo(T*pT)
{ return ( pT == 0 ); }
};

однако, поскольку шаблоны в настоящее время ограничены глобальным такой шаблон является недопустимым.

  • '':
  • 'template-member-function':
  • 'template-static-member':
  • 'template-static-data-member 'template-member': Альтернативные термины для определения члена, появляющегося отдельный к "классу-шаблону", к которому он принадлежит. Для пример : -
template<class T> int S<T>::sep_member()
{ return i; }