Guarda ora ho provato.
Facendo le seguenti modifiche a me compila:

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);
   private:
      nodo<tipoelem> cella;
};

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());
}


#endif
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;
};

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>::getprec()
{
   return(precedente);
}

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

template<class T>
nodo<T> *nodo<T>::getsuc()
{
   return(successivo);
}


#endif


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

using namespace std;

int main()
{
   listap<int> list;
   
   cout << list.listavuota() << "\n\n";
   
   cout << list.primolista() << "\n\n";
   
   listap<int>::posizione posi = list.primolista();
   cout << list.finelista(posi) << "\n\n";
   
   cout << list.leggilista(posi) << "\n\n";
   
   int el = 50;
   list.scrivilista(posi, el);
   cout << list.leggilista(posi) << "\n\n";
   
   cout << list.succlista(list.primolista()) << "\n\n";
   
   system("pause");
   return 0;
}
prova un po' e fammi sapere...

PS:

Se stai usando il dev (prima di tutto ti consiglio di cambiarlo) dopo aver apportato le modifiche fai CTRL+F11, oppure clicca su esegui e nel menù che appare clicca su Riassembla tutto