ciao a tutti, sto creando una struttura dati astratta LISTA con i seguenti codici:

listap.h
codice:
#ifndef _listap_h
#define _listap_h

#include <iostream>
#include <stdlib.h>

template<class tipoelem>
class listap
{
   public:
      typedef listap *posizione;
      
      listap();
      ~listap();
      
      void crealista();
      bool listavuota();
      posizione primolista();
      bool finleista(posizione);
      tipoelem leggilista(posizione);
      void scrivilista(posizione, tipoelem);
      posizione succlista(posizione);
      posizione predlista(posizione);
      void inslista(posizione, tipoelem);
      void canclista(posizione);   
   private:
      listap *precedente;
      tipoelem elemento;
      listap *successivo;
};

#endif
listap.cpp
codice:
#include "listap.h"
#include <iostream>
#include <stdlib.h>

using namespace std;

template<class tipoelem>
listap<tipoelem>::listap()
{
   this->crealista();
}

template<class tipoelem>
listap<tipoelem>::~listap()
{
   delete elemento;
}

template<class tipoelem>
void listap<tipoelem>::crealista()
{
   precedente = NULL;
   elemento = new(tipoelem);
   successivo = NULL;
}

template<class tipoelem>
bool listap<tipoelem>::listavuota()
{
   return((precedente == NULL) && (successivo == NULL));
}

template<class tipoelem>
listap<tipoelem>::posizione listap<tipoelem>::primolista()
{
   return(this);
}

template<class tipoelem>
bool listap<tipoelem>::finelista(listap<tipoelem>::posizione pos)
{
   return(this->succlista(pos));
}

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

template<class tipoelem>
void listap<tipoelem>::scrivilists(listap<tipoelem>::posizione pos, tipoelem elem)
{
   pos->elemento = elem;
}

template<tipoelem>
listap<tipoelem>::posizione listap<tipoelem>::succlista(listap<tipoelem>::posizione pos)
{
   return(pos->successivo);
}

template<tipoelem>
listap<tipoelem>::posizione listap<tipoelem>::predlista(listap<tipoelem>::posizione pos)
{
   return(pos->precedente);
}

template<tipoelem>
void listap<tipoelem>::inslista(posizione pos, tipoelem elem)
{
   posizione temp = NULL;
   temp->successivo = pos;
   temp->precedente = pos->precedente;
   (pos->precedente)->successivo = temp;
   pos->precedente = temp;
   
   temp->elemento = elem;
   
   pos = temp;
}

template<tipoelem>
void listap<tipoelem>::canclista(posizione pos)
{
   posizione temp = pos;
   (temp->precedente)->successivo = temp->successivo;
   (temp->successivo)->precedente = temp->precedente;
   pos = pos->successivo;
   
   delete(temp);
}
quando compilo la classe mi dà il seguente errore alla riga 34:

34 C:\Dev-Cpp\esercizi\listap.cpp expected constructor, destructor, or type conversion before "listap"
34 C:\Dev-Cpp\esercizi\listap.cpp expected `;' before "listap" .

io penso che sia dovuto al fatto che ho usato la typedef nel file listap.h.
perchè mi dà questo errore??? io devo per forza usare il tipo posizione.
vi prego aiutatemi.