Ver Mensaje Individual
  #5 (permalink)  
Antiguo 13/08/2011, 07:52
Checho360
 
Fecha de Ingreso: marzo-2011
Mensajes: 94
Antigüedad: 13 años, 9 meses
Puntos: 3
Respuesta: Sobrecarga de << con template

Bueno, al final he hecho esto:

Código C++:
Ver original
  1. #include <iostream>
  2. #include <new>
  3. using namespace std;
  4.  
  5. template< class T >
  6. class PILA_DATOS{
  7.       template< class t > friend class PILA;
  8.      
  9.       public:
  10.              template< class U > friend ostream& operator<< ( ostream &,
  11.              const PILA_DATOS< U > & );
  12.              PILA_DATOS< T >* getPtrPilaSig ();
  13.       private:
  14.               T nodo;
  15.               PILA_DATOS< T > *ptrPilaSiguiente;
  16.              
  17. };
  18.  
  19. template< class U > ostream& operator<< ( ostream &salida,
  20. const PILA_DATOS< U > &a ){
  21.      
  22.       salida << a.nodo;
  23.       return salida;
  24.      
  25. }
  26.  
  27. template< class T >
  28. PILA_DATOS< T >* PILA_DATOS< T >::getPtrPilaSig (){
  29.            
  30.             return ptrPilaSiguiente;
  31.            
  32. }
  33.  
  34. template< class T >
  35. class PILA{
  36.       public:
  37.              PILA();
  38.              PILA< T > &empujarPila ( const T& );
  39.              PILA< T > &sacarPila ();
  40.              PILA< T > &mostrarPila ();
  41.              template< class U > friend ostream& operator<< ( ostream &,
  42.              const PILA< U > & );
  43.       private:
  44.               PILA_DATOS< T > *ptrPila;
  45.               bool estaVacia ();
  46.              
  47. };
  48.  
  49. template< class T >
  50. PILA< T >::PILA (){
  51.      
  52.       ptrPila = NULL;
  53.      
  54. }
  55.  
  56. template< class T >
  57. bool PILA< T >::estaVacia (){
  58.      
  59.      return ( ptrPila == NULL ? true : false );
  60.      
  61. }
  62.  
  63. template< class T >
  64. PILA< T > &PILA< T >::empujarPila ( const T &a ){
  65.        
  66.         if ( estaVacia () ){
  67.              
  68.              ptrPila = new PILA_DATOS< T >;
  69.              ptrPila->nodo = a;
  70.              ptrPila->ptrPilaSiguiente = NULL;
  71.              
  72.         }
  73.        
  74.         else{
  75.              
  76.              PILA_DATOS< T > *nuevaPila;
  77.              nuevaPila= new PILA_DATOS< T >;
  78.              nuevaPila->nodo = a;
  79.              nuevaPila->ptrPilaSiguiente = ptrPila;
  80.              ptrPila = nuevaPila;
  81.              
  82.         }
  83.        
  84.         return *this;
  85.        
  86. }
  87.  
  88. template< class T >
  89. PILA< T > &PILA< T >::sacarPila (){
  90.      
  91.       PILA_DATOS< T > *temp;
  92.       temp = ptrPila;
  93.       ptrPila = ptrPila->ptrPilaSiguiente;
  94.       delete temp;
  95.       return *this;
  96.      
  97. }
  98.  
  99. template< class T >
  100. PILA< T > &PILA< T >::mostrarPila (){
  101.      
  102.       PILA_DATOS< T > *a = ptrPila;
  103.       while ( a != NULL ){
  104.             cout << a->nodo << "->";
  105.             a = a->ptrPilaSiguiente;
  106.       }
  107.       cout << "NULL" << endl;
  108.       return *this;
  109.      
  110. }
  111.  
  112. template< class U > ostream& operator<< ( ostream &salida,
  113. const PILA< U > &a ){
  114.      
  115.       PILA_DATOS< U > *b = a.ptrPila;
  116.       while ( b != NULL ){
  117.             salida << *b << "->";
  118.             b = b->getPtrPilaSig ();
  119.       }
  120.       salida << "NULL" << endl;
  121.       return salida;
  122.      
  123. }
  124.  
  125. int main (){
  126.    
  127.     PILA< float > a;
  128.     a.empujarPila (2.5).empujarPila (3).empujarPila(23).empujarPila (25);
  129.     cout << a;
  130.     a.sacarPila().sacarPila();
  131.     cout << a;
  132.    
  133.     getchar();
  134.     return 0;
  135.    
  136. }

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!!