Para responder a su primera pregunta: Sí, es sabio y obligatorio incluir guardias en las clases de plantilla. O más estrictamente rodeando todo el contenido de cada archivo de encabezado.
Esta es la forma de obedecer la regla de una sola definición cuando tiene cosas en los archivos de encabezado, por lo que se comparte y sigue siendo seguro. Puede haber otros archivos de encabezado que incluyen el suyo. Cuando el compilador compila un archivo de módulo, puede ver un #include
del archivo de encabezado muchas veces, pero los guardias se activan en el segundo y posteriores para asegurarse de que el compilador solo ve el contenido una vez.
No importa que el compilador repase cualquier cosa; ese es su trabajo. Solo tiene que proporcionar el contenido una vez y luego el compilador lo ha visto y puede consultarlo tantas veces como lo necesite.
Agregar incluir guardias siempre, acostumbrarse, ya que es una BUENA práctica. – Poni
Si haces algún desarrollo en win32, incluye '#pragma una vez' siempre que uses incluir guardias. – KitsuneYMG
+1 para indicar que las instancias se hacen usando la estructura de datos interna construida en el momento del primer barrido – Otuken