Класс шаблона — это множество возможных классов, поэтому я спрашивал меня: директивы препроцессора
#ifndef MY_CLASS
#define MY_CLASS
template<typename T>
class My_Class
{};
#endif
необходимы?
Класс шаблона — это множество возможных классов, поэтому я спрашивал меня: директивы препроцессора
#ifndef MY_CLASS
#define MY_CLASS
template<typename T>
class My_Class
{};
#endif
необходимы?
Защита включения предотвращает повторное включение одного и того же файла. Они нужны вам, чтобы предотвратить единицу перевода, содержащую следующие недопустимые определения:
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() {}
Макросы, вероятно, используются в качестве «защиты включения», предотвращая ошибки множественных объявлений, если заголовок включается несколько раз. Так что да, они «настолько необходимы», как и для всего остального: если вы можете быть уверены, что заголовок никогда не будет включаться несколько раз, вы можете их не включать, но, с другой стороны, они на самом деле не увеличивают размер файла. или время компиляции.
My_Class
— это шаблон класса (обратите внимание, что это шаблон).My_Class<int>
— это класс шаблона (обратите внимание, что это класс). Все дело в названии, как говорит Уильям Шатнер :-) - person Kerrek SB   schedule 18.08.2012