Originariamente inviato da pietrol83
...però poi non mi è stato possibile implementare i metodi private di cui si serve il metodo naturalmergesort() perchè non è possibile istanziare oggetti della classe lista...
Basta cambiare modificatore: protected invece di private. Non vedo il problema.

Per le righe in rosso del metodo mergesort.
Ti sei accorto di usare pointer che puntano alla luna invece che a una istanza dinamica di lista?
(Che comunque non puoi avere visto che lista ha metodi puri?)

Cambiando il modificatore d'accesso e derivando la classe come avevi fatto prima avrai:
codice:
template<class posizione, class tipoelem>
void lista<posizione, tipoelem>::naturalmergesort()
{
   int numerocatene;
   lista<posizione, tipoelem> *A, *B, *L;

   A = new listap<quel che è> ;
   B = new listap<quel che è> ;
   L = new listap<quel che è> ;

   do
   {
      A->crealista();
      B->crealista();
      distribuisci(*A, *B);
      numerocatene = 0;
      crealista();
      merge(*A, *B, *L, &numerocatene);
   }while(numerocatene != 1);

   // eventuali delete di A, B, L

}