Jeśli przeniosę ciało metody statycznej do odrębnego cpp kompilator krzyczy Undefined reference dla tejże metody.
Bo szablony nie mogą być zdefiniowane w plikach cpp.
Z kolei, jeśli jej ciało zostanie w pliku h, to dostaję Undefined reference dla wszystkich pól użytych w metodzie statycznej.
Jeśli robisz to tak jak jest w tym kodzie który wkleiłeś (tzn. definiujesz tą statyczną metode w definicji klasy, a definicja statycznego pola masz pod klasą), to nic dziwnego. Kompilator jeszcze nie widzi definicji statyczna, a ma kompilować metode korzystającą z niej.
Spróbuj tak (nie testowałem, ale myśle, że powinno działać):
/* To wszystko to header */
template<class Object, class State>
class Base{
static int statyczna;
State * currentState;
public:
static void doSomething();
Base(State* cState)
:currentState (cState){}
Base(){};
~Base(){};
};
template<class Object, class State> int Base<Object, State>::statyczna = 1;
template<class Object, class State> void Base<Object, State>::doSomething()
{
statyczna++;
statyczna -= 10;
}