Salve, ho un problema che vorrei esporvi. Ho fatto diverse prove e credo di aver individuato la causa.
Il codice è questo:
#ifndef LISTA_PUNTATORI_H
#define LISTA_PUNTATORI_H
template <typename T> class Lista_puntatori {
// blocco di interesse---------------------
struct nodo {
T elemento;
nodo * successivo;
nodo * precedente;
};
typedef nodo * posizione;
//fine blocco di interesse------------------
public:
Lista_puntatori();
~Lista_puntatori();
void creaLista();
void insLista(T, posizione);
void scriviLista(T, posizione);
void cancLista(posizione);
bool listaVuota();
bool fineLista(posizione);
posizione primoLista();
posizione succLista(posizione);
posizione precLista(posizione);
T leggiLista(posizione);
private:
posizione primo;
};
template <class T> Lista_puntatori<T>::Lista_puntatori(){
creaLista();
};
template <class T> Lista_puntatori<T>::~Lista_puntatori(){
posizione p;
while (primo != NULL){
p = primo;
primo = primo->successivo;
delete p;
}
};
template <class T> void Lista_puntatori<T>::creaLista(){
primo = NULL;
};
template <class T> void Lista_puntatori<T>::insLista(T elem, posizione p){
posizione temp;
temp->elemento = elem;
temp->successivo = p;
if (primo == p){
temp->precedente = NULL;
primo = temp;
} else {
temp->precedente = p->precedente;
precLista(p)->successivo = temp;
p->precedente = temp;
}
};
template <class T> void Lista_puntatori<T>::scriviLista(T elem, posizione p){
if ((primo != NULL) && (p != NULL)){
p->elemento = elem;
}
};
template <class T> void Lista_puntatori<T>::cancLista(posizione p){
if ((p != NULL) && (primo != NULL)){
precLista(p)->successivo = p->successivo;
succLista(p)->precedente = p->precedente;
delete p;
}
};
template <class T> bool Lista_puntatori<T>::listaVuota(){
return (primo == NULL);
};
template <class T> bool Lista_puntatori<T>::fineLista(posizione p){
return (p == NULL);
};
template <class T> posizione Lista_puntatori<T>::primoLista(){
return primo;
};
template <class T> posizione Lista_puntatori<T>::succLista(posizione p){
if (p != NULL)
return p->successivo;
else
return NULL;
};
template <class T> posizione Lista_puntatori<T>::precLista(posizione p){
if (p != NULL)
return p->precedente;
else
return NULL;
};
template <class T> T Lista_puntatori<T>::leggiLista(posizione p){
if (p != NULL)
return p->elemento;
else
return NULL;
};
#endif
Il problema principale è: in fase di compilazione, mi da errore "expected constructor, destructor, or type conversion before "Lista_puntatori"" e "expected ';' before "Lista_puntatori"" sulle righe 98, 102, e 108, che sono le implementazioni delle funzioni primoLista(), succLista() e precLista().
Per quanto ne ho capito, il problema deriva dalla definizione di "posizione" (infatti tutte quelle funzioni dovrebbero restituire un dato di tipo posizione).
La causa dovrebbe essere il fatto che nodo e posizione sono definiti dopo la dichiarazione della classe (dopo la 3a riga in pratica, commentato come "blocco di interesse"), mentre dovrebbero essere posizionati prima della 3a riga.
Per risolvere questo problema, ho provato a portare il "blocco di interesse" prima della 3a riga.
Il risultato è che, giustamente, lì non sa ancora cos'è T (utilizzata nello struct) e quindi se provo in quest'altro modo dà errore: 'T' does not name a type.
#ifndef LISTA_PUNTATORI_H
#define LISTA_PUNTATORI_H
// blocco di interesse---------------------
struct nodo {
T elemento;
nodo * successivo;
nodo * precedente;
};
typedef nodo * posizione;
//fine blocco di interesse------------------
template <typename T> class Lista_puntatori {
Per far conoscere T in quel punto, dovrei fare una dichiarazione anticipata della classe, ma anche se provo a fare:
#ifndef LISTA_PUNTATORI_H
#define LISTA_PUNTATORI_H
template <typename T> class Lista_puntatori;
// blocco di interesse---------------------
struct nodo {
T elemento;
nodo * successivo;
nodo * precedente;
};
typedef nodo * posizione;
//fine blocco di interesse------------------
template <typename T> class Lista_puntatori {
mi dice sempre 'T' does not name a type.
Ora, come potrei fare per far funzionare sto codice?
Avete qualche idea?
Grazie.