В чем разница между классом шаблона и шаблоном класса?
В чем разница между классом шаблона и шаблоном класса?
Ответы:
Это обычная путаница для многих (включая страницу общего программирования в Википедии, некоторые руководства по C ++ и другие ответы на этой странице). Что касается C ++, не существует такого понятия, как «шаблонный класс», есть только «шаблон класса». Эту фразу можно читать как «шаблон для класса» в отличие от «шаблона функции», который является «шаблоном для функции». Опять же: классы не определяют шаблоны, шаблоны определяют классы (и функции). Например, это шаблон , а именно шаблон класса , но это не класс :
template<typename T> class MyClassTemplate
{
...
};
Объявление MyClassTemplate<int> - это класс, или педантично, класс, основанный на шаблоне. Нет никаких особых свойств класса, основанного на шаблоне, по сравнению с классом, не основанным на шаблоне. Особые свойства относятся к самому шаблону .
Фраза «шаблонный класс» ничего не означает, потому что слово «шаблон» не имеет значения как прилагательное, когда применяется к существительному «класс» в C ++. Это подразумевает существование класса, который является (или определяет) шаблоном , что не является концепцией, существующей в C ++.
Я понимаю распространенную путаницу, поскольку она, вероятно, основана на том факте, что слова появляются в порядке «шаблонный класс» на реальном языке, а это совсем другая история.
Бьярн Страуструп, создатель C ++, говорит в своей книге The C ++ Programming Language 4th edition , 23.2.1 Defining a Template:
Есть люди , которые делают семантические различия между терминами шаблоном класса и шаблонным классом . Я не; это было бы слишком тонко: пожалуйста, считайте эти термины взаимозаменяемыми. Точно так же я считаю шаблон функции взаимозаменяемым с функцией шаблона .
Разница в том, что термин «шаблонный класс» просто не существует в стандарте C ++. Этот термин используется в основном людьми, которые думают, что термин «шаблон класса» сбивает с толку (например, компании Qt, Nokia и ранее Trolltech).
Стандарт не понимает этого, поэтому другие люди должны изменить ситуацию. Некоторые люди используют его как синоним, а другие говорят, что термин «шаблонный класс» относится к конкретному или явно специализированному шаблону класса, что делает его эквивалентным термину «специализация шаблона класса». Исторически это имело такое значение. В Annotated Справочное руководство определяет на странице 343
Класс, созданный из шаблона класса, называется классом шаблона, как и класс, специально определенный с именем класса-шаблона в качестве его имени.
Нетерминальное -имя-шаблонный класс эквивалентно нетерминальным -шаблон идентификатор , используемый в сегодняшнем Standard и нисходит 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; };
Шаблонный класс связан с шаблоном проектирования Template Method , а шаблон класса - это просто шаблон класса «заполнить пробелы».
Шаблон класса - это шаблон, который используется для создания классов, тогда как класс шаблона - это класс, который создается шаблоном.
Класс шаблона: класс, имеющий общее определение, или класс с параметрами, экземпляр которого не создается до тех пор, пока информация не будет предоставлена клиентом. Это жаргон для простых шаблонов. Просто класс с префиксным шаблоном и использованием T. Шаблон класса: Индивидуальное построение класса определяется шаблоном класса, который почти аналогичен тому, как отдельные объекты создаются с использованием класса. Обращается к объекту шаблона класса Ex- имя класса имя объекта (список аргументов)
Шаблон класса - это общий класс для разных типов объектов. По сути, он предоставляет спецификацию для создания классов на основе параметров. Каждый раз, когда создается новый объект, для этой цели в памяти будет размещаться новый класс. Это называется созданием экземпляра шаблона класса, и каждая созданная версия класса называется классом шаблона.
Взгляните на эту статью (из wg21, опубликованную в 1992 году) :
Последовательная терминология
На сегодняшний день большая часть споров и разногласий связана с терминологией, используемой в главе, описывающей шаблоны. Наиболее частым является изменяющаяся применение «функции-шаблона» и «матричной функции» , чтобы выразить различные идеи и намерения. Поскольку единообразное именование не применяется, результатом являются путаница и споры.
Для целей этого документа, как предложение для официального принятия комитетом при обсуждении шаблонов, а также в целях разъяснения документации; Я предлагаю принять формализацию, согласно которой завершающий «-шаблон» описывает набор типов или функций, описываемых шаблоном. И что ведущий « шаблон-» используется для описания определения шаблона части «-шаблона» , например
'template-member-function'. Таким образом: -
- 'шаблон-функции': набор функций, описываемых шаблоном, параметрических для некоторой информации о типе, предоставленной в качестве аргумента для этого шаблона. Например :-
template<class T> int nullcheck( T* pT )
{ return ( pT != 0 ); }
- 'шаблон-класс': набор классов, описываемых шаблоном, параметрических по некоторой информации о типе, предоставленной в качестве аргумента для этого шаблона. Например :-
template<class T> class S {
int i;
public:
int sep_member();
int imm_member()
{ return 2; }
}
- 'template-function': этот термин больше не разрешен. **
'template-class': этот термин не разрешен. **
'шаблон-функция-член': этот термин не разрешен, так как он описывает свойство, которое в настоящее время не поддерживается определением шаблона. Используя приведенное выше соглашение о терминологии, это будет описывать член неклассового шаблона, определение которого само является шаблоном. Например :-
class Normal { public:
template<class T> int foo(T*pT)
{ return ( pT == 0 ); }
};
Однако, поскольку шаблоны в настоящее время ограничены глобальной областью, такой шаблон недействителен.
- 'шаблон-статическая-функция-член':
- 'шаблон-член-функция':
- 'шаблон-статический-член':
- 'template-static-data-member ' template-member ': Альтернативные термины для определения члена, появляющегося отдельно от' шаблона-класса ', которому он принадлежит. Например :-
template<class T> int S<T>::sep_member()
{ return i; }
Normalклассе, который вы описали выше: я не знал, что такой шаблон-член-функция был запрещен. Его принимают все компиляторы, которые я пробовал. Что мне не хватает?