PDA

Visualizza la versione completa : classe template - C++


pietrol83
13-03-2010, 16:25
salve, sn riuscito a implementare la classe lista e funziona. ora, per˛, sto cercando di renderla una classe template ma nel metodo primolista mi da un errore di compilazione. questo Ŕ il codice della calsse:

listap.h


#ifndef _LISTAP_H
#define _LISTAP_H

#include <iostream>

using namespace std;

template<class T> class listap
{
private:
typedef int tipoelem;
struct nodo
{
nodo *precedente;
T elemento;
nodo *successivo;
};
typedef T tipoelem;
public:
typedef nodo * posizione;
posizione sentinella;

listap();
void crealista();
bool listavuota();
posizione primolista();
bool finelista(posizione);
void inslista(posizione &, tipoelem);
void canclista(posizione &);
tipoelem leggilista(posizione);
void scrivilista(posizione &, tipoelem);
posizione predlista(posizione);
posizione succlista(posizione);
};

#endif


listap.cpp


#include "listap.h"
template<class T> listap<T>::listap()
{
crealista();
}

template<class T> void listap<T>::crealista()
{
sentinella = (posizione)malloc(sizeof(nodo));
tipoelem elemnullo = 0;
sentinella->precedente = sentinella;
sentinella->elemento = elemnullo;
sentinella->successivo = sentinella;
}

template<class T> bool listap<T>::listavuota()
{
return((sentinella->precedente == sentinella) && (sentinella->successivo == sentinella));
}

template<class T> listap::posizione listap<T>::primolista()
{
return(sentinella->successivo);
}

template<class T> bool listap<T>::finelista(posizione p)
{
return(p->successivo == sentinella);
}

template<class T> void listap<T>::inslista(posizione &p, tipoelem elem)
{
posizione temp = new nodo;
temp->elemento = elem;
temp->precedente = p->precedente;
temp->successivo = p;
p->precedente->successivo = temp;
p->precedente = temp;
p = temp;
}

template<class T> void listap<T>::canclista(posizione &p)
{
posizione temp = p;
p->precedente->successivo = p->successivo;
p->successivo->precedente = p->precedente;
p = p->successivo;
delete(temp);
}

template<class T> listap<T>::tipoelem listap::leggilista(posizione p)
{
return(p->elemento);
}

template<class T> void listap<T>::scrivilista(posizione &p, tipoelem elem)
{
p->elemento = elem;
}

template<class T> listap<T>::posizione listap::predlista(posizione p)
{
return(p->precedente);
}

template<class T> listap<T>::posizione listap::succlista(posizione p)
{
return(p->successivo);
}


l'errore che mi viene notificato Ŕ il seguente:
`template<class T> class listap' used without template parameters

ho provato a cercare dei suggerimenti in rete ma non sn riuscito a risolvere il problema. in cosa avrei sbagliato???

pietrol83
14-03-2010, 19:03
raga quando compilo il codice mi da il seguente errore alla linea 21 (relativo al metodo primolista):

21 C:\Dev-Cpp\esercizi\liste\listap.cpp expected constructor, destructor, or type conversion before "listap" .

che errore avrei commesso??? e, in particolare, perchŔ ai metodi precedenti al quest'ultimo non mi ha segnalato errori???

shodan
14-03-2010, 19:11
Salta all'occhio questo:


template<class T> typename listap<T>::posizione listap<T>::primolista()

pietrol83
14-03-2010, 19:13
ooooooohhhhhh!!!! grazie 1000.

shodan
14-03-2010, 19:16
Prego. Attento agli errori di linking. :98:

pietrol83
14-03-2010, 21:01
ecco infatti ho riscontrato errori di linking!!! a cosa ssono dovuti?

shodan
14-03-2010, 21:53
La definizione e l'implementazione delle classi template non pu˛ essere divisa in due file. Devi mettere tutto in un unico file .h

antotan
14-03-2010, 23:19
Una curiositÓ: dato che utilizzi il C++, perchŔ non utilizzare new/delete per la gestione dinamica della memoria?

edit: e se non vado errato, non gestisci la deallocazione della memoria, ad esempio utilizzando il distruttore di classe

:ciauz:

Loading