ciao a tutti, ho creato la struttura lista con puntatori. nel test della lista il metodo canclista, che elimina un nodo della lista, mi dà errore. posto i codici:

nodo.h
codice:
#ifndef _nodo_h
#define _nodo_h

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

using namespace std;

template<class T>
class nodo
{
   public:
      nodo();
      void setprec(nodo *);
      void setelem(T);
      void setsuc(nodo *);
      nodo *getprec();
      T getelem();
      nodo *getsuc();
   private:
      nodo *precedente;
      T elemento;
      nodo *successivo;
};

#endif

template<class T>
nodo<T>::nodo()
{
   precedente = NULL;
   elemento = 0;
   successivo = NULL;
}

template<class T>
void nodo<T>::setprec(nodo *prec)
{
   precedente = prec;
}

template<class T>
void nodo<T>::setelem(T elem)
{
   elemento = elem;
}

template<class T>
void nodo<T>::setsuc(nodo *succ)
{
   successivo = succ;
}

template<class T>
nodo<T>::nodo<T> *nodo<T>::getprec()
{
   return(precedente);
}

template<class T>
T nodo<T>::getelem()
{
   return(elemento);
}

template<class T>
nodo<T>::nodo<T> *nodo<T>::getsuc()
{
   return(successivo);
}
listap.h
codice:
#ifndef _listap_h
#define _listap_h

#include "nodo.h"
#include <iostream>
#include <stdlib.h>
#include <stdio.h>

using namespace std;

template<class tipoelem>
class listap
{
   public:
      typedef nodo<tipoelem> *posizione;
           
      listap();      
      void crealista();
      bool listavuota();
      posizione primolista();
      bool finelista(posizione);
      tipoelem leggilista(posizione);
      void scrivilista(posizione, tipoelem);
      posizione succlista(posizione);
      posizione predlista(posizione);
      void inslista(posizione &, tipoelem);
      void canclista(posizione &);
   private:
      nodo<tipoelem> cella;
};

#endif

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

template<class tipoelem>
void listap<tipoelem>::crealista()
{
   cella.setprec(&cella);
   cella.setsuc(&cella);
   cella.setelem(0);
}

template<class tipoelem>
bool listap<tipoelem>::listavuota()
{
   return((cella.getprec() == &cella) && (cella.getsuc() == &cella));
}

template<class tipoelem>
typename listap<tipoelem>::posizione listap<tipoelem>::primolista()
{
   return(&cella);
}

template<class tipoelem>
bool listap<tipoelem>::finelista(typename listap<tipoelem>::posizione pos)
{
   return(pos->getsuc() == primolista());
}

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

template<class tipoelem>
void listap<tipoelem>::scrivilista(typename listap<tipoelem>::posizione pos, tipoelem elem)
{
   pos->setelem(elem);
}

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

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

template<class tipoelem>
void listap<tipoelem>::inslista(typename listap<tipoelem>::posizione &pos, tipoelem elem)
{
   posizione temp = new nodo<tipoelem>;
   
   temp->setprec(pos->getprec());
   temp->setsuc(pos);
   (pos->getprec())->setsuc(temp);
   pos->setprec(temp);
   temp->setelem(elem);
   pos = temp;
}

template<class tipoelem>
void listap<tipoelem>::canclista(typename listap<tipoelem>::posizione &pos)
{
   posizione temp = pos;
   
   (pos->getsuc())->setprec(pos->getprec());
   (pos->getprec())->setsuc(pos->getsuc());
   pos = pos->getsuc();
   delete temp;
}
testlista.cpp
codice:
#include "listap.h"
#include <iostream>
#include <stdlib.h>

using namespace std;

int main()
{
   listap<int> list;
   listap<int>::posizione pos = list.primolista();
   
   for(int i = 1; i < 10; i++)
   {
      list.inslista(pos, i);
      pos = list.succlista(pos);
   }
   
   pos = list.primolista();
   while(!list.finelista(pos))
   {
      cout << pos << "\t";
      cout << list.predlista(pos) << " " << list.leggilista(pos) << " " << list.succlista(pos) << "\n";
      pos = list.succlista(pos);
   }
   
   cout << "\n\n" << list.primolista() << "\n";
   
   list.canclista(list.primolista());
   
   while(!list.finelista(pos))
   {
      cout << pos << "\t";
      cout << list.predlista(pos) << " " << list.leggilista(pos) << " " << list.succlista(pos) << "\n";
      pos = list.succlista(pos);
   }
   
   system("pause");
   return 0;
}
lerrore che mi viene visualizzato è il seguente:

28 C:\Dev-Cpp\esercizi\testlstap.cpp no matching function for call to `listap<int>::canclista(nodo<int>*)'

perchè mi dà errore al metodo canclista mentre al metodo inslista va tutto bene???

help me!!!