Классы шаблонов и директивы препроцессора

Класс шаблона — это множество возможных классов, поэтому я спрашивал меня: директивы препроцессора

#ifndef MY_CLASS
#define MY_CLASS

template<typename T>
class My_Class
{};

#endif

необходимы?


person Community    schedule 18.08.2012    source источник
comment
Вы имеете в виду шаблон класса. Класс шаблона - это нечто другое.   -  person Kerrek SB    schedule 18.08.2012
comment
@KerrekSB: я согласен, что спрашивающий означает шаблон класса. Однако не так просто выяснить, какое значение имеет класс шаблона, кроме того, что это ошибочный способ написания шаблона класса. Можете ли вы пролить свет на это для меня? Что означает класс шаблона?   -  person Magnus Hoff    schedule 18.08.2012
comment
@MagnusHoff: My_Class — это шаблон класса (обратите внимание, что это шаблон). My_Class<int> — это класс шаблона (обратите внимание, что это класс). Все дело в названии, как говорит Уильям Шатнер :-)   -  person Kerrek SB    schedule 18.08.2012
comment
@KerrekSB Да, я имею в виду шаблон класса. Спасибо за разъяснения!   -  person    schedule 18.08.2012
comment
C++11 изменил терминологию по сравнению с той, которая использовалась в стандарте C++03 в этой области. Термин класс шаблона больше не используется. В настоящее время правильным термином является специализация шаблона, к большому разочарованию тех из нас, кому нравилась хитрость шаблона класса по сравнению с классом шаблона.   -  person Pete Becker    schedule 19.08.2012


Ответы (2)


Защита включения предотвращает повторное включение одного и того же файла. Они нужны вам, чтобы предотвратить единицу перевода, содержащую следующие недопустимые определения:

template <typename T> class My_Class { };
template <typename T> class My_Class { };

// Error: redefinition of ‘class Foo<T>’

Повторное включение происходит очень легко. Например, рассмотрим случай, когда вы включаете A и B, а A уже включает B по какой-то недокументированной причине. Возможно, вы не имеете права исключать B из своих явных включений, но и A не должно требоваться, чтобы не включать его. Только с помощью включения защиты (или какого-либо эквивалентного механизма) вы можете сделать такую ​​файловую структуру возможной.

В двух словах: вы можете иметь повторяющиеся декларации, но только одно определение в пределах одной единицы перевода.

Встречный пример: следующее допустимо:

template <typename T> class Foo;
template <typename T> class Foo;
template <typename T> class Foo;
template <typename T> class Foo;
template <typename T> class Foo { };
int main() {}

person Kerrek SB    schedule 18.08.2012

Макросы, вероятно, используются в качестве «защиты включения», предотвращая ошибки множественных объявлений, если заголовок включается несколько раз. Так что да, они «настолько необходимы», как и для всего остального: если вы можете быть уверены, что заголовок никогда не будет включаться несколько раз, вы можете их не включать, но, с другой стороны, они на самом деле не увеличивают размер файла. или время компиляции.

person Christian Stieber    schedule 18.08.2012