Si. Il compilatore non può sapere cosa sia il tipo T del template se il metodo è in un file .ccp. Può saperlo solo se se il metodo è nel file .h
Il compilatore non ha idea di cosa sia StateManager finchè non trova la definizione della classe. Tuttavia il compilatore sa cosa è un puntatore per cui ti permette di effettuare una forward reference a StateManager a patto che:Inoltre mi sapresti spiegare come mai in questa classe mi fa solo ed esclusivamente dichiarare un attributo StateManager *manager io vorrei dichiararlo così StateManager manager;
1) la dichiarazione sia un puntatore;
2) tu non usi tale puntatore prima di aver definito StateManager.
Ora non discuto le scelte di design, ma a mio parere è inutile creare una funzione template per changeState. Conviene passare a tale funzione un puntatore valido a StateManager creato fuori da tale funzione, altrimenti non ha senso il concetto di chiamare changeState una funzione il cui contenuto è fissato a compile time e non a run time.
Sopratutto è meglio usare uno smart pointer (unique_ptr<>) per la gestione del life time del puntatore stesso, ma questo fa parte del percorso formativo del C++ moderno.


Rispondi quotando