Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [C++] Template di tipo strutturato ed errori a cascata

    Salve a tutti,
    ho un problema nel passare ad un template un tipo strutturato.

    Lo spezzone di codice incriminato è il seguente:

    codice:
    template <class T>
    struct _cella{
    	Cella<T> * genitore;
    	Cella<T> * sinistro;
    	Cella<T> * destro;
    		T valore;
          };
    //typedef struct _cella Cella_Albero;
    
    template <class T>
    class Bin_treel : public Bin_tree<T, int>{
    
      public:
        typedef typename ListaP<T>::posizione posizione;
    	typedef typename Bin_tree<T, posizione>::value_type value_type;
    	typedef typename Bin_tree<T, posizione>::Nodo Nodo;
    
        // costruttori e distruttori
        Bin_treel();
        //~Bin_treel();
    
        // operatori
        void create();
        bool empty();
    
        Nodo root();
        Nodo parent(Nodo);
        Nodo sx(Nodo);
        Nodo dx(Nodo);
        bool sx_empty(Nodo);
        bool dx_empty(Nodo);
    
        //void costr(Bin_treel<T>);
        void erase(Nodo);
    
        T read(Nodo);
        void write(Nodo , value_type );
    
        void ins_root(Nodo);
        void ins_sx(Nodo);
        void ins_dx(Nodo);
    
      private:
        ListaP<_cella<T> > spazio;
        int nNodi;
        Nodo inizio;
        posizione NIL;
    };
    Ovvero io dichiaro il tipo strutturato globale _cella (globale perchè avevamo visto che se era dentro una funzione il c++ non permetteva di passarlo in un template) e poi nella mia classe cerco di creare una lista "spazio" passandogli quel tipo in questo modo
    codice:
    ListaP<_cella<T> > spazio;
    L'errore che mi da su quella dichiarazione è:

    codice:
    cannot declare field 'Bin_treel<int>::spazio' to be of abstract type 'ListaP<_cella<int> >'	Bin_treel.cpp	/Alberi Binari	line 50	C/C++ Problem
    Il codice completo lo trovate qui incollato tutto assieme:
    http://www.ideone.com/o6k2b

    Per farvi vedere tutti gli errori che mi da.

    Potete invece anche trovarlo diviso per file per una migliore lettura qui:
    Main del programma: http://www.ideone.com/qJB9n
    Bin_treel.h : http://www.ideone.com/gM9sE
    Bin_tree.h : http://www.ideone.com/oscLl
    ListaP.h : http://www.ideone.com/ypZsO
    Cella.h : http://www.ideone.com/aiJ6c
    Liste_collegate.h : http://www.ideone.com/XGApr

    Comprendo che il programma è gigante (circa 1000 righe di codice) ma il problema fondamentale dipende proprio dal fatto che non mi prende quel tipo strutturato, se riuscissi a farlo andare si risovlerebbero quasi tutti gli errori. Mi sfugge però cos'è che non va.

    Ringrazio in anticipo chi avrà l'infinita pazienza di aiutarmi,
    Neptune.
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Se gli errori sono quelli che hai riportato, la linea 487 è ambigua:
    codice:
    ListaP<_cella<T>> spazio;
    Un dichiarazioen simile è possibile in VC++ (anche 2008/2010 Express) o con g++ (ultime versioni) abilitando il supporto al C++0x (come riportato dallo warning). Per evitare ambiguità, per il momento è sempre meglio mettere uno spazio tra le parentesi angolari di chiusura.

    In linea 570 ( e seguenti) usi _cella senza il parametro template. Sai che non è optional, vero?
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Originariamente inviato da shodan
    Se gli errori sono quelli che hai riportato, la linea 487 è ambigua:
    codice:
    ListaP<_cella<T>> spazio;
    Un dichiarazioen simile è possibile in VC++ (anche 2008/2010 Express) o con g++ (ultime versioni) abilitando il supporto al C++0x (come riportato dallo warning). Per evitare ambiguità, per il momento è sempre meglio mettere uno spazio tra le parentesi angolari di chiusura.

    In linea 570 ( e seguenti) usi _cella senza il parametro template. Sai che non è optional, vero?
    Sisi so che non è optional e solo che stavo facendo un bel pò di taglia e incolla vari.

    Ora sono giunto a modificare il file Bin_treel.h nel seguente modo: http://www.ideone.com/jZ60e

    Non so perchè però con il seguente main:



    codice:
    //#include "Bin_treec.cpp"
    #include "Bin_treel.cpp"
    using namespace std;
    
    int main() {
    	/*Test alberi con cursore*/
    	cout << "Alberi binari con curose:   " << endl;
    	Bin_treel<int> albero;
    
    	//Inserisco dei valori
    	albero.ins_root();
    	albero.write(albero.root(),1987);
    
    	//gli stampo
    	cout << "read: " << albero.read(albero.root()) << endl;
    	return 0;
    }
    Mi stampa numeri a casaccio tipo 2147344384
    Non riesco proprio a capire a cosa si riferisce, eppure dovrebbe andare bene ora! Ho messo pure delle stampe di debug un pò ovunque.

    Insomma ora me lo compila ma non rieco a capire cosa sono quei numeri che mi stampa.

    Comunque riguardo la scrittura dei template con un pò di prove me ne ero accorto anch'io che scrivendole attaccate gli dava fastidio, purtroppo non è solo quello il problema.
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Non darti una risposta perché a me non compila niente.
    Probabilmente stai stampando degli indirizzi di memoria di qualche puntatore.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  5. #5
    Originariamente inviato da shodan
    Non darti una risposta perché a me non compila niente.
    Probabilmente stai stampando degli indirizzi di memoria di qualche puntatore.
    Era effettivamente un problema di puntatori, mi ingarbugliavo con il puntare all'inizio della lista.

    Ho però ancora un problema, con la funzione parent, praticamente se cerco il genitore del figlio sinistro, del figlio sinistro della radice, non so perchè mi da la radice stessa invece che il figlio sinistro della radice. Se faccio la stessa cosa per il figlio destro, due funzioni praticamente uguali, va.

    Cioè se ho Nonno->padre_primogenito->figlio_primogenito e cerco il parent di figlio_primogenito mi da nonno invece che padre_primogenito e non so perchè.

    Ho aggiornato:


    Bin_tree.h: http://www.ideone.com/i2UVX
    Bin_treel.h: http://www.ideone.com/1byHy
    main.cpp: http://www.ideone.com/8yMal
    ListaP.h: http://www.ideone.com/rUwW6

    Non mi ricordo se gli ho aggiornati o meno ma per sicurezza gli rimetto:

    Liste_collegate.h: http://www.ideone.com/Vj933
    Cella.h: http://www.ideone.com/nvC4a

    Sostanzialemnte la funzione parent ritorna, se il nodo non è la radice, il campo "genitore" del nodo stesso. Quindi sono andato a vedere se c'era qualche problema nell'inserimento nel nodo ovvero ins_sx() ed ins_dx() ma c'è scritto bello grosso:

    codice:
    elemento.genitore = n;
    Quindi non capisco perchè prenda la radice come padre per il sinistro, e sopratutto come mai destro e sinistro che sono due fuzioni pressochè identiche lavorino in modo diverso.
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.