Шаблон статической переменной

Я не могу понять, почему, если мы определяем статическую переменную обычного (не шаблонного) класса в заголовке, у нас есть ошибка компоновщика, но в случае шаблонов все работает нормально, и, кроме того, у нас будет один экземпляр статической переменной среди всех единиц перевода :

Это заголовок шаблона (template.h):

// template.h
template<typename T>
class Templ {
public:
  static int templStatic;
};

template<typename T> Templ<T>::templStatic = 0;

Это первый модуль, использующий шаблон (unit1.cpp)

// unit1.cpp
#include "template.h"

int method1() {
  return Templ<void>::templStatic++;
}

Второй блок здесь (unit2.cpp):

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

И, наконец, main.cpp:

// main.cpp
#include <iostream>
int method1();
int method2();

int main(int argc, char** argv) {
  std::cout << method1() << std::endl;
  std::cout << method2() << std::endl;
}

После компиляции, связывания и выполнения этого кода у нас будет следующий вывод:

0
1

Так почему же в случае с шаблонами все работает нормально (и как положено)? Как компилятор или компоновщик справляются с этим (мы можем скомпилировать каждый файл .cpp в отдельном вызове компилятора, а затем связать их с помощью вызова компоновщика, чтобы компилятор и компоновщик не «видели» все файлы .cpp одновременно)?

PS: мой компилятор: msvcpp 9 (но тоже проверял на mingw)

Ответы на вопрос(3)

Ваш ответ на вопрос