Salve a tutti ho un problema che non riesco a risolvere in questo programa che vi descrivo in poche parole: Il programma vuole gestire una gerarchia di animali; la classe padre (che è anche virtuale in quanto possiede una funzione del tipo "virtual stampa_dati()=0") si chiama animale e in essa sono definite il codice dell'animale e la specie.Poi ci sono 2 classi figlie che sono mammifero e rettile in cui sono definite alcune funzioni "speciali" e dove vi sono ridefinite la funzione virtuale della classe padre. Poi si vuole realizzare un oggetto pila statica in cui vengono pushati i mammiferi che pesano meno di 100 kg e i rettili che sono definiti di tipo "A".Nella realizzazione della gerarchia di animali non ho trovato difficoltà, ma le ho trovate quando devo implementare la classe pila statica; in particolare il compilatore mi da i seguenti errori che proprio non riesco a risolvere; vi posto qui lo spezzone di codice in cui ci sono gli errori e dopo il resto del programma:
codice:
 In member function `void pila::inserisci_nodo(rettile, mammifero)': 
no match for 'operator=' in 'p[((pila*)this)->pila::t] = e' 
no match for 'operator=' in 'p[((pila*)this)->pila::t] = f' 

In member function `void pila::stampa_pila() const': 
no match for 'operator<<' in 'std::cout << p[i]' 

#ifndef PILAS_H_
#define PILAS_H_

#include "rettile.h"
#include "mammifero.h"

#include <iostream>
using namespace std;


class pila{
      
            private:
                    int t;
                    static const int dim=5;
                    
             
             public:
                    pila(){t=0;}
                    pila(const pila &);
                    const pila & operator=(const pila &){};
                    void inserisci_nodo(const rettile e,const mammifero f);
                    void stampa_pila()const;
      };
      
#endif

#include "pila.h"
#include <iostream>
using namespace std;



void pila::inserisci_nodo(const rettile e,const mammifero f)
{
 pila p[dim];
 if(e.get_tipo()=="A")
  {
   p[t]=e;
   t++;
  } else if(f.get_peso()<100)
    { p[t]=f;
    t++;}
}

void pila::stampa_pila() const
{
 pila p[dim];
 cout<<"Gli animali presenti nella pila sono:\n";
 for(int i=0;i<dim;i++)
  cout<<p[i]<<endl;
}
Ecco il resto del programma dove è illustrata la realizzazione della gerarchia:

codice:
#ifndef ANIMALE_H_
#define ANIMALE_H_
#include <iostream>
#include <string>

using namespace std;

class animale{
      
      protected:        
              string codice;
              string specie;
              
      public: 
              animale(const string c="",const string s="")
              {codice=c;specie=s;}
              animale(const animale &);
              const animale & operator=(const animale & A);
              virtual void stampa_dati()=0;
      
      
      };
      
#endif


#include "animale.h"

animale::animale(const animale & A)
{
 this->codice=A.codice;
 this->specie=A.specie;
}

const animale & animale::operator=(const animale & A)
{
 if(this!=&A)
 {
  this->codice=A.codice;
  this->specie=A.specie;
 }
 return *this;
}


#ifndef MAMMIFERO_H_
#define MAMMIFERO_H_

#include "animale.h"
#include <string>

class mammifero:public animale{
      
      private:
              float peso;
              
      public:
             mammifero(const string c="",const string s="",const float p=0.0):animale(c,s)
             {peso=p;}
             mammifero(const mammifero &);
             const mammifero & operator=(const mammifero &);
             virtual void stampa_dati();
             float get_peso() const {return peso;}
      };
      
#endif


#include "mammifero.h"

mammifero::mammifero(const mammifero & M):animale(M)
{this->peso=M.peso;}

const mammifero & mammifero::operator=(const mammifero & M)
{
 if(this!=&M)
 {
  animale::operator=(M);
  this->peso=M.peso;
 }
 return *this;
}
  
 

void mammifero::stampa_dati()
{
 cout<<"Dati relativi ad un mammifero:\n";
 cout<<"Codice: "<<codice<<"\n";
 cout<<"Specie: "<<specie<<"\n";
 cout<<"Peso: "<<peso<<"\n";
}


#ifndef RETTILE_H_
#define RETTILE_H_

#include <iostream>
#include <string>
#include "animale.h"

using namespace std;

class rettile:public animale{
      
      private:
              string tipoesemplare;
              
      public:
             rettile(const string c="",const string s="",const string t=""):animale(c,s)
             {tipoesemplare=t;}
             rettile(const rettile &);
             const rettile & operator=(const rettile &);
             virtual void stampa_dati();
             const string get_tipo() const {return tipoesemplare;}
      
      
      };
#endif      

#include "rettile.h"

rettile::rettile(const rettile & R):animale(R)
{this->tipoesemplare=R.tipoesemplare;}

const rettile & rettile::operator=(const rettile & R)
{
 if(this!=&R)
 {
  animale::operator=(R);
  this->tipoesemplare=R.tipoesemplare;
 }
 return *this;
}
  

void rettile::stampa_dati()
{
cout<<"Codice: "<<codice<<"\n";
cout<<"Specie: "<<specie<<"\n";
cout<<"Tipo di esemplare: "<<tipoesemplare<<"\n";
}