Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    14

    [C++] aiuto sull'utilizzo dei template...

    salve a tutti, ragazzi come da titolo non ho capito bene come cavolo si usino questi template, vi faccio un esempio di codice che mi restituisce sempre errori:

    codice:
    //definizione di una cella
    #ifndef listap_h
    #define listap_h
    
    //la cella rappresenta una componente della lista
    template <class E>
    struct cella {
           E info;
           cella* succ;
           };
           
    template <class Elem>
    class Listap {
          public:
                 cella* posizione;
                 //costruttore
                 Listap();
                 //distruttore
                 ~Listap();
                 //operazioni
                 void creaLista();
                 bool Listavuota();
                 Elem leggiLista(posizione);
                 void scriviLista(Elem, posizione);
                 posizione primoLista();
                 bool fineLista(posizione);
                 posizione succLista(posizione);
                 posizione predLista(posizione);
                 void insLista(Elem, posizione );
                 void cancLista(posizione );
          private:
                  posizione lista;
                  //la lista è un puntatore ad una posizione che a sua volta punta ad una cella
    };
    ovviamente seguono tutte le implementazioni delle funzioni ecc...ecc...
    fatto sta che quando vado a compilare il codice mi ritrovo diversi errori, ve ne elenco qualcuno:

    2 testLista.cpp In file included from testLista.cpp
    15 listap.h ISO C++ forbids declaration of `cella' with no type
    ....
    ....
    ...
    24 listap.h `posizione' has not been declared
    ....
    ...
    ...

    praticamente a quanto ho capito mi da un errore ogni volta che uso posizione poichè il primo errore è proprio nella riga:
    cella* posizione;

    Mi dite come cavolo avrei dovuto definire un puntatore ad una cella???
    dove sbaglio????

    GRAZIE mille e ciao
    " Meglio bruciare velocemente che ardere lentamente " K.D.Cobain

  2. #2

    Re: [C++] aiuto sull'utilizzo dei template...

    Originariamente inviato da MeSo

    praticamente a quanto ho capito mi da un errore ogni volta che uso posizione poichè il primo errore è proprio nella riga:
    cella* posizione;

    Mi dite come cavolo avrei dovuto definire un puntatore ad una cella???
    dove sbaglio????
    prova con
    Codice PHP:
    cella <Elem> * posizione

  3. #3
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    si ma posizione non è un tipo e tu lo utilizzi come un tipo...

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    14
    Ragazzi grazie mille, ho risolto quell'errore, avevate ragione entrambi ci voleva il tipo parametrico ed in piu' dovevo definire posizione come un tipo altrimenti non andava, ho sostituito la riga:
    cella* posizione; in typedef cella<Elem>* posizione; e adesso ho eliminato tutti gli errori che mi ritrovavo su ogni occorrenza di posizione nel programma!
    " Meglio bruciare velocemente che ardere lentamente " K.D.Cobain

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    14
    salve, ragazzi utilizzo lo stesso post poichè il problema ha sempre a che fare con template, ho realizzato una classe Lista<Elementi> quindi con i soliti template, in questa classe dichiaro un nuovo tipo come al solito:

    codice:
    #ifndef listavet_h
    #define listavet_h
    
    // lunghezza massima della lista
    const int DIMENSIONE = 1000;
    
    // classe Lista
    template< class Elem >
    class Lista
      {
    
      public:
        typedef int posizione;
    il tipo in questione è posizione, fin qui tutto ok, adesso viene il problema:

    ho creato un nuovo file chiamato Tool_lista.h e .cpp in cui ci sono solo funzioni che sono utili alla lista ad esempio stampaLista o epuraLista vi faccio vedere uno spezzone di esempio:

    codice:
    #include "tool_lista.h"
    #include "listavet.h"
    #include <iostream>
    
    using namespace std;
    
    //funzione stampa una lista
    template <class Elementi>
    void stampaLista(Lista<Elementi> &l){
         cout<<"[" ;
         Lista<Elementi>::posizione indice;
         for (indice = l.primoLista(); ((!l.finelista(indice)) && (indice < DIMENSIONE)); indice = l.succLista(indice))
            {
                     cout << l.leggilista(indice).stampaPersona();
                     if (!l.finelista(l.succLista(indice)))
                     cout << ", ";
            }
         cout<<"]\n";
    }

    il problema è che mi ritrovo con diversi errori tutti dovuti alla dichiarazione:
    Lista<Elementi>:osizione indice;
    dal codice si capisce che voglio utilizzare una variabile di tipo posizione con nome indice per ciclare nella lista, ma non capisco perchè mi ritrovo con questi errori:

    ...\tool_lista.cppIn function `void stampaLista(Lista<Elementi>&)':
    ...\tool_lista.cpp In function `void stampaLista(Lista<Elementi>&)':
    11 ...\tool_lista.cpp `indice' undeclared (first use this function)
    (Each undeclared identifier is reported only once for each function it appears in.)


    Perchè mi ritrovo con questi errori???
    Sbaglio a dichiarare la variabile indice, perchè????
    Aiutatemi perpiacere.

    GRAZIE mille e ciao
    " Meglio bruciare velocemente che ardere lentamente " K.D.Cobain

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Non è possibile definire un template in un file .cpp, devi spostare la funzione nel .h

    Inoltre metti :

    typename Lista<Elementi>:osizione

    per far capire al compilatore che - posizione - non è una variabile, ma uno specificatore.

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    14
    grazie mille per l'aiuto sono riuscito a far funzionare tutto finalmente
    " Meglio bruciare velocemente che ardere lentamente " K.D.Cobain

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    14
    salve a tutti, ragazzi scusate la mia grande ignoranza sul c++, però ho ancora un problema e avrei bisogno del vostro aiuto il mio problema stavolta è sui puntatori in c++, credo di avere qualche problema ad utilizzarli, vi espongo il problema:
    il codice sorgente è sempre quello del mio primo post, una lista fatta con record e puntatori, ho implementato tutte le funzioni per la gestione della lista ed ovviamente quelli più importanti sono quelli in cui si inserisce e si elimina un alemento dalla lista.Con le funzioni che ho realizzato io, il programma si compila bene, nessun errore, però quando lacio l'eseguibile si pianta e mi compare una schermata di avviso di quelle di win che mi dice:
    La memoria a cui tento di accedere 0x025..... non poteva essere written.
    primi ok per terminare
    premi annulla per il debug

    a questo punto credo che ho combinato quelche cavolata con i puntatori, anche perchè nel main, non faccio altro che inserire 4 elementi nella lista e con un ciclo li stampo, quindi nulla di particolare.

    Vi posto il codice relativo alle sole due funzioni che secondo me mi portano questo errore di logica, ditemi quale cavolata ho fatto stavola:

    codice:
    //inserisce un nuovo componente nella lista, prima della poszione passata come parametro
    template <class Elem>
    void Listap<Elem>::insLista(Elem e, posizione p)
    {
         posizione temp ;
         if (p == primoLista())
         {
               temp = lista;
               lista->info = e;
               lista->succ = temp;
         }
         else
         {
             temp = p;
             p->info = e;
             p->succ = temp;
         }
    }
    
    //cancella un componente della lista, collegando quelli rimanenti se necessario
    template <class Elem>
    void Listap<Elem>::cancLista(posizione p)
    {
         if (!fineLista(p))
         {
              if (p == primoLista())
              {
                    lista = lista->succ;
              }
              else
              {
                  posizione q = predLista(p);
                  q->succ = p->succ;
              }
         }
         delete(p);
    Ancora grazie mille a tutti e ciao
    " Meglio bruciare velocemente che ardere lentamente " K.D.Cobain

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.