Чтобы ответить на ваш первый вопрос: да, разумно и обязательно включать охранников вокруг шаблонных классов. Или более строго, окружая все содержимое каждого заголовочного файла.
Это способ подчиниться Правилу Одного Определения, когда у вас есть содержимое в заголовочных файлах, так что оно доступно и все еще безопасно. Там могут быть другие заголовочные файлы, которые включают в себя ваши. Когда компилятор компилирует файл модуля, он может видеть #include
вашего заголовочного файла много раз, но защитники включаются во второй и последующий раз, чтобы убедиться, что компилятор видит содержимое только один раз.
Неважно, что компилятор что-то анализирует; это его работа. Вам просто нужно предоставить содержимое один раз, и компилятор увидит его и сможет ссылаться на него снова столько раз, сколько ему нужно.