[C++] Dichiarazione anticipata con classe template - problem

di Anonimizzato5119 il
4 risposte
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.

4 Risposte

  • Perchè devi usare una struct all'interno della classe? Puoi creare semplicemente dei menbri interni alla classe.
  • Overflow ha scritto:


    perchè devi usare una struct all'interno della classe? Puoi creare semplicemente dei menbri interni alla classe.
    Perchè devo creare una lista di nodi, e quindi non posso usare membri della classe
    Ho provato anche a sostituire lo struct con una classe esterna, ma mi da gli stessi errori negli stessi punti.

    ps: forse non ho capito cosa intendevi.
  • Se utilizzi la classe al posto della struct, la includi come friend nella classe principale(lista_puntatori)
  • Overflow ha scritto:


    se utilizzi la classe al posto della struct, la includi come friend nella classe principale(lista_puntatori)
    Provato...sempre stesso errore..sigh..
Devi accedere o registrarti per scrivere nel forum
4 risposte