Ho la classe grafo nel file grafo.h; un metodo di questa classe deve restituirmi un oggetto lista con template,opportunamente implementato e funzionante su un altra libreria:

#include "nAdiacenti.h"
#include "listap.h"

template <class T>

class Grafo{
public:
typedef T tipoelem;
typedef int posizioneNodo;
static const int NIL = 0;
//typedef Lista<
//typedef int nodo;
struct nodo{
tipoelem label;
bool mark;
nAdiacenti *listaNodiAdiacenti;
};
Grafo();
Grafo(int);
//~Grafo();
//grafo con oggetto;
void creaGrafo();//sc
bool grafoVuoto();//sc
void insNodo(posizioneNodo);//sc
void insArco(posizioneNodo,posizioneNodo);//sc
void cancNodo(posizioneNodo);//
void cancArco(posizioneNodo,posizioneNodo);//sc
Lista<nodo> adiacenti(podizioneNodo);
bool esisteNodo(posizioneNodo);//sc
bool esisteArco(posizioneNodo,posizioneNodo);//sc
tipoelem leggiNodo(posizioneNodo);//sc
void scriviNodo(posizioneNodo, tipoelem);//sc

private:
nodo *NodiGrafo;
int MAXNODI;
posizioneNodo cercaPosLib();


};
Il problema è che il solo scrivere così la classe fa apparire un errore strano (si aspetta un ; prima della parentesi) se poi vado a implementare il metodo che come ritorno ha la lista(template<class T>typename Lista<nodo> Grafo<T>::adiacenti(posizioneNodo u)) mi escono tutta una serie di errori stranissimi...chi mi da una mano a capire cosa succede?