Вы объявили свой идентификатор как статический:
static unsigned int CIDCounter = 0;
, что означает, что каждый модуль компиляции получит свою собственную копию переменной.Вместо этого вы должны объявить его как extern в заголовочном файле:
extern unsigned int CIDCounter;
и инициализировать его в файле реализации
unsigned int CIDCounter = 0;
Следует отметить, что без соответствующих блокировок это не будет потоком-safe.
Для дальнейшего пояснения:
Ключевое слово static
в этом контексте означает, что переменная или функция ограничена текущей единицей компиляции (обычно это файл cpp).Я предполагаю, что у вас есть, скажем, main.cpp
и idcounter.cpp
- так что теперь у нас есть две переменные (по одной для каждой из единиц компиляции) main_CIDCounter
и idcounter_CIDCounter
(имена переменных только для пояснения!).
Когда вы выполняете свой тестовый код в main.cpp, функция шаблона видит main_CIDCounter
, потому что это текущая единица компиляции, и вы получите ожидаемое 1,2,3.Однако при вызове ComponentCount()
используется код из idcounter.cpp
, и этот код видит idcounter_CIDCounter
- который вообще не был изменен.Если бы у вас были другие модули компиляции, вы бы увидели похожее поведение, где каждый файл cpp, похоже, поддерживает свой собственный счетчик идентификаторов.
Исправление, которое я описал, состоит в том, чтобы просто иметь только одну копию CIDCounter
вidcounter.cpp
и объявить его как внешний для всех остальных модулей компиляции.