Problema con visual studio
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:
Implementazione della ridefinizione e del metodo:
Main:
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?
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
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); }
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.
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.
A occhio direi che hai definito l'operatore << come funzione membro della classe Data. Deve essere invece una funzione libera.
Grazie mille, ho risolto spostando il prototipo fuori dalla classe.