Problema con visual studio

oleg.fresi
Nella mia classe Data ho tre file: il main, un header dove ci sono tutti i prototipi e un file cpp con le implementazioni. In paeticolare ho un problema con un operatore ridefinito e con un metodo:
Prototipo del l'operatore ridefinito e del metodo utilizzato:
std::ostream& operator<<(std::ostream&, const Data&);
std::string formato_breve();


Implementazione della ridefinizione e del metodo:
std::ostream& operator<<(std::ostream& stream, const Data& d)
{
	stream << d.formato_breve();
	return stream;
}

std::string Data::formato_breve()
{
  return std::to_string(giorno) + "/" +
         std::to_string(mese) + "/" +              //giorno, mese e anno sono private
         std::to_string(anno);
}


Main:
Data d1{ 2, 1, 2017 };
	cout << d1 << endl;


Visual studio mi dà qusti due errori di compilazione:
Gravità Codice Descrizione Progetto File Riga Stato eliminazione
Errore C2662 'std::string Data::formato_breve(void)': impossibile convertire il puntatore 'this' da 'const Data' a 'Data &'

Gravità Codice Descrizione Progetto File Riga Stato eliminazione
Errore C2804 'operator <<' (binario) ha troppi parametri

Gravità Codice Descrizione Progetto File Riga Stato eliminazione
Errore (attivo) E1086 l'oggetto include qualificatori di tipo non compatibili con la funzione membro funzione "Data::formato_breve"

Potreste aiutarmi a risolverli per favore?

Risposte
claudio862
std::ostream& operator<<(std::ostream& stream, const Data& d)
{
   stream << d.formato_breve();
   return stream;
}

Stai chiamando la funzione membro 'formato_breve()' su una variabile di tipo 'const Data &', che è un riferimento a un oggetto costante Data. Essendo costante, non puoi modificare le sue variabili membro.
In C++ puoi aggiungere 'const' alla firma di una funzione membro per specificare che tale funzione non può modificare variabili membro (fatta eccezione se dichiarate 'mutable'), e quindi rendere possibile chiamare tale funzione su oggetti costanti.

In breve, aggiungi 'const' alla firma della funzione (sia nel prototipo che nell'implementazione):

std::string Data::formato_breve() const // <- aggiungi 'const' qui
{
  return std::to_string(giorno) + "/" +
         std::to_string(mese) + "/" +              //giorno, mese e anno sono private
         std::to_string(anno);
}

oleg.fresi
Ho fatto come hai detto tu, ma continua a darmi questi errori:

Gravità Codice Descrizione Progetto File Riga Stato eliminazione
Errore C2804 'operator <<' (binario) ha troppi parametri

Gravità Codice Descrizione Progetto File Riga Stato eliminazione
Errore (attivo) E0349 nessun operatore "<<" corrispondente agli operandi

Gravità Codice Descrizione Progetto File Riga Stato eliminazione
Errore C2679 '<<' binario: non è stato trovato alcun operatore che accetti un operando destro di tipo 'Data'. È anche possibile che non vi siano conversioni accettabili.

claudio862
A occhio direi che hai definito l'operatore << come funzione membro della classe Data. Deve essere invece una funzione libera.

oleg.fresi
Grazie mille, ho risolto spostando il prototipo fuori dalla classe.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.