|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jan 2007
Città: Trani
Messaggi: 1772
|
[C++] Dichiarazione anticipata con classe template - problema
Salve, ho un problema che vorrei esporvi. Ho fatto diverse prove e credo di aver individuato la causa.
Il codice è questo: Codice:
#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
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. Codice:
#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 {
Codice:
#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 {
Ora, come potrei fare per far funzionare sto codice? Avete qualche idea? Grazie.
__________________
Compravendite:serpone, canta, edema, ErodeGrigo, Baccus, Carbv, Siemens2007, Dragon2002, peppequo, xdaf, Macerf900 + tante altre.... Ultima modifica di innaig86 : 25-09-2008 alle 22:12. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jan 2007
Città: Trani
Messaggi: 1772
|
up
__________________
Compravendite:serpone, canta, edema, ErodeGrigo, Baccus, Carbv, Siemens2007, Dragon2002, peppequo, xdaf, Macerf900 + tante altre.... |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Perchè non fare una classe template Nodo?
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jan 2007
Città: Trani
Messaggi: 1772
|
Ci avevo pensato e ho provato poco fa: stesso errore
__________________
Compravendite:serpone, canta, edema, ErodeGrigo, Baccus, Carbv, Siemens2007, Dragon2002, peppequo, xdaf, Macerf900 + tante altre.... |
|
|
|
|
|
#5 |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Ciao,
prova così: Codice:
...
template <class T> typename Lista_puntatori<T>::posizione Lista_puntatori<T>::primoLista(){
return primo;
};
template <class T> typename Lista_puntatori<T>::posizione Lista_puntatori<T>::succLista(posizione p){
if (p != NULL)
return p->successivo;
else
return NULL;
};
template <class T> typename Lista_puntatori<T>::posizione Lista_puntatori<T>::precLista(posizione p){
if (p != NULL)
return p->precedente;
else
return NULL;
};
...
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Be' scusa ma così definisci una struct dentro la definizione di una classe, è consentito? Io abbozzerei qualcosa del genere:
Codice:
template <typename T>
{
struct nodo
{
T elemento;
struct nodo *successivo;
struct nodo *precedente;
};
typedef struct nodo *posizione;
class ListaPuntatori
{
/* ... */
};
}
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Codice:
typedef struct nodo *posizione; Se nelle righe incriminate sostituisci Codice:
posizione Codice:
typename Lista_puntatory<T>::posizione
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
ops. ho visto dopo che ti ha gia' risposto correttamente Vincenzo
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:35.



















