Доброй ночи!
Помогите, пожалуйста, правильно ли это:
1) будет существовать отдельно статическая переменная foo<T>::Stat, а также для каждого конкретного типа своя (например, foo<int>::Stat, foo<double>::Stat и т. д.);
2) при создании обьекта foo<int> значение foo<int>::Stat будет инициализировано значением foo<T>::Stat.
Ваш шаблон объявил статическую переменную, но не определил её. Статическая переменная будет существовать только при условии её определения в .cpp файле. Статическая переменная будет инициализирована именно в точке определения.
Если хочется "магии" - чтобы статическая переменная определялась автоматически, можно использовать такой прием:
template<typename T>
class foo
{
public:
static inline int& stat() { static int _storage; return _storage; }
};
Недостаток этого приема: вместо переменной используется функция. Например
foo<T>::stat() = 10;
Но этот недостаток, на мой взгляд, компенсируется тем, что не нужно явно определять статическую переменную при инстанциировании шаблона.