В чем разница между классом шаблона и шаблоном класса?
Это обычная путаница для многих (включая страницу общего программирования в Википедии, некоторые руководства по 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<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; } }
class Normal { public: template<class T> int foo(T*pT) { return ( pT == 0 ); } };
template<class T> int S<T>::sep_member() { return i; }
источник
Normal
классе, который вы описали выше: я не знал, что такой шаблон-член-функция был запрещен. Его принимают все компиляторы, которые я пробовал. Что мне не хватает?