Вы получаете две копии одной и той же переменной, потому что вы объявили статическую переменную в заголовочном файле. Когда вы объявляете глобальную переменную static
таким образом, вы говорите, что она локальна для модуля компиляции (файл .o
). Поскольку вы включаете заголовок в две единицы компиляции, вы получаете две копии count
.
Я думаю, что вам действительно нужна статическая переменная-член шаблона, связанная с каждым экземпляром класса шаблона. Это будет выглядеть так:
template <class T>
class MyClass
{
// static member declaration
static int count;
...
};
// static member definition
template<class T> int MyClass<T>::count = 0;
Это даст вам счет за каждый экземпляр вашего шаблона. То есть у вас будет счет для MyClass<int>
, MyClass<foo>
, MyClass<bar>
и т. Д. f1()
теперь будет выглядеть так:
void f1() {
MyClass<int> a;
a.f();
cout<<"F1: " << MyClass<int>::count <<"\n";
}
Если вам нужен счетчик для всех экземпляров MyClass (независимо от их шаблонных параметров), вам необходимо использовать глобальную переменную .
Однако вам, вероятно, не нужна глобальная переменная напрямую, потому что вы рискуете использовать ее до ее инициализации. Вы можете обойти это, создав глобальный статический метод, который возвращает ссылку на ваш счет:
int& my_count() {
static int count = 0;
return count;
}
Затем получите доступ к нему из вашего класса следующим образом:
void f() {
++my_count();
}
Это обеспечит инициализацию счетчика до его использования, независимо от того, с какого модуля компиляции вы к нему обращаетесь. См. C ++ FAQ по статическому порядку инициализации для получения более подробной информации.