Bueno, al final he hecho esto:
Código C++:
Ver original#include <iostream>
#include <new>
using namespace std;
template< class T >
class PILA_DATOS{
template< class t > friend class PILA;
public:
template< class U > friend ostream& operator<< ( ostream &,
const PILA_DATOS< U > & );
PILA_DATOS< T >* getPtrPilaSig ();
private:
T nodo;
PILA_DATOS< T > *ptrPilaSiguiente;
};
template< class U > ostream& operator<< ( ostream &salida,
const PILA_DATOS< U > &a ){
salida << a.nodo;
return salida;
}
template< class T >
PILA_DATOS< T >* PILA_DATOS< T >::getPtrPilaSig (){
return ptrPilaSiguiente;
}
template< class T >
class PILA{
public:
PILA();
PILA< T > &empujarPila ( const T& );
PILA< T > &sacarPila ();
PILA< T > &mostrarPila ();
template< class U > friend ostream& operator<< ( ostream &,
const PILA< U > & );
private:
PILA_DATOS< T > *ptrPila;
bool estaVacia ();
};
template< class T >
PILA< T >::PILA (){
ptrPila = NULL;
}
template< class T >
bool PILA< T >::estaVacia (){
return ( ptrPila == NULL ? true : false );
}
template< class T >
PILA< T > &PILA< T >::empujarPila ( const T &a ){
if ( estaVacia () ){
ptrPila = new PILA_DATOS< T >;
ptrPila->nodo = a;
ptrPila->ptrPilaSiguiente = NULL;
}
else{
PILA_DATOS< T > *nuevaPila;
nuevaPila= new PILA_DATOS< T >;
nuevaPila->nodo = a;
nuevaPila->ptrPilaSiguiente = ptrPila;
ptrPila = nuevaPila;
}
return *this;
}
template< class T >
PILA< T > &PILA< T >::sacarPila (){
PILA_DATOS< T > *temp;
temp = ptrPila;
ptrPila = ptrPila->ptrPilaSiguiente;
delete temp;
return *this;
}
template< class T >
PILA< T > &PILA< T >::mostrarPila (){
PILA_DATOS< T > *a = ptrPila;
while ( a != NULL ){
cout << a->nodo << "->";
a = a->ptrPilaSiguiente;
}
cout << "NULL" << endl;
return *this;
}
template< class U > ostream& operator<< ( ostream &salida,
const PILA< U > &a ){
PILA_DATOS< U > *b = a.ptrPila;
while ( b != NULL ){
salida << *b << "->";
b = b->getPtrPilaSig ();
}
salida << "NULL" << endl;
return salida;
}
int main (){
PILA< float > a;
a.empujarPila (2.5).empujarPila (3).empujarPila(23).empujarPila (25);
cout << a;
a.sacarPila().sacarPila();
cout << a;
return 0;
}
Compila y funciona, pero me gustaría saber si se puede hacer de alguna forma que no requiera la funcion miembro de PILA_DATOS getPtrPilaSig. Además no entiendo por qué hay que declarar una clase amigo o una función amigo como una plantilla con un "tipo diferente" , es decir en lugar de T declarar t o U. Cómo sabe el compilador que U o t es igual al T del template actual?
Un saludo!!