Шаблон статической переменной
Я не могу понять, почему, если мы определяем статическую переменную обычного (не шаблонного) класса в заголовке, у нас есть ошибка компоновщика, но в случае шаблонов все работает нормально, и, кроме того, у нас будет один экземпляр статической переменной среди всех единиц перевода :
Это заголовок шаблона (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)