A questo punto ha ragione Oregon, scrivere "struct" è accettato dal compilatore (secondo me una struct simile a una classe confonde le idee...)

Per quanto riguarda gli altri due punti:

1) Gli altri nove file non caricheranno più l'header, perchè sarà già stato caricato la prima volta. In Visual C++ esiste una soluzione più pulita, la direttiva "#pragma once", che indica al compilatore di caricare un dato header una sola volta (gli altri file che ne hanno bisogno lo troveranno già caricato).

2) DataManager<bool> indica un tipo "contenitore", cioè la cui definizione contiene un tipo di dato definibile dall'utente. Un esempio famoso è list<int>, che indica una lista contenente numeri interi.