Dichiarazione e definizione di un template devono essere visibili in ogni unità di compilazione che ne fa uso, altrimenti il compilatore non sa come istanziare il template stesso.
Il problema si risolve nel modo che hai fatto.