Variabile statica del modello

Non riesco a capire perché, se definiamo la variabile statica della solita class (non template) nell’intestazione, abbiamo l’errore linker, ma in caso di template tutto funziona bene e inoltre avremo un’unica istanza di variabile statica tra tutte le unità di traduzione :

È l’intestazione del modello (template.h):

// template.h template class Templ { public: static int templStatic; }; template Templ::templStatic = 0; 

È la prima unità che usa template (unit1.cpp)

 // unit1.cpp #include "template.h" int method1() { return Templ::templStatic++; } 

Seconda unità qui (unit2.cpp):

 // unit2.cpp #include "template.h" int method2() { return Templ::templStatic++; } 

E, infine, main.cpp:

 // main.cpp #include  int method1(); int method2(); int main(int argc, char** argv) { std::cout << method1() << std::endl; std::cout << method2() << std::endl; } 

Dopo aver compilato, collegato ed eseguito questo codice, avremo l’output seguente:

 0 1 

Quindi, perché in caso di modelli tutto funziona correttamente (e come previsto)? Come il compilatore o il linker gestiscono questo (possiamo compilare ogni file .cpp in una chiamata separata del compilatore, e quindi collegarli con caling al linker, quindi il compilatore e il linker non “vedono” tutti i file .cpp allo stesso tempo)?

PS: Il mio compilatore: msvcpp 9 (ma controllato anche su mingw)