2014-06-21 4 views
1

Je continue à obtenir une erreur du compilateur avec mon programme dans Visual Studio Express 13 Je commentais les 2 lignes dans mon code où l'erreur du compilateur montre jusqu'àErreur de surcharge de l'opérateur?

Date.cpp

#include "Date.h" 
using namespace std; 

Date::Date(int d, int m, int y) : day(d), month(m), year(y) 
{} 

Date::Date() : day(0), month(0), year(0) 
{} 

const int Date::getDay() { return day; } 

const int Date::getMonth() { return month; } 

const int Date::getYear(){ return year; } 

bool Date::operator<(const Date dOther) 
{ 
    return (year < dOther.year) || (year == dOther.year && month < dOther.month) 
     || (year == dOther.year && month == dOther.month && day < dOther.day); 
} 

string Date::toString() //Error: Declaration is incompatible with...declared at line 21...Date.h 
{ 
    string s = month + "-" + day; s+="-" + year; 
    return s; 
} 


ofstream& operator<<(ofstream& out, Date& d) 
{ 
    string s = d.toString(); 
    out.write(s.c_str(), s.size());   
    return out; 
} 

void Date::operator=(string s) //no instance of overloaded function "Date::operator=" matches the specified type 
{ 
    stringstream stream; 
    stream << s; 
    stream >> month; 
    stream >> day; 
    stream >> year; 
} 

Date.h

#ifndef DATE_CLASS 
#define DATE_CLASS 
#include <iostream> 
#include <string> 
#include <fstream> 
#include <sstream> 

class Date 
{ 
private: 
int day, month, year; 

public: 
Date(); 
Date(int, int, int); 

const int getDay(); 
const int getMonth(); 
const int getYear(); 

string toString();   
bool operator<(const Date); 

friend ofstream& operator<<(ofstream& out, Date&d); 


void operator=(string); 

}; 

#endif 

Je ne sais pas pourquoi ces erreurs apparaissent. Est-ce un problème de surcharge de l'opérateur? ou quelque chose avec Visual Studio (pour une raison quelconque, si je supprime du code dans Date.cpp, les erreurs du compilateur disparaissent)?

+1

Vous devriez vraiment utiliser 'const' sur vos fonctions membres, le cas échéant, ne pas retourner les choses' const', et avoir 'operator =' retourner une 'Date &'. Faire aussi 'operator <<' prendre une 'const Date &' et ne pas être un ami car il n'a pas besoin d'être ici. Et probablement juste en faisant 'out << s;' et en prenant un 'std :: ostream &' pour qu'il fonctionne avec plus que des fichiers. – chris

+1

Est-ce votre code exact? Il devrait y avoir des erreurs dans votre fichier d'en-tête. Pas de 'std ::' n'importe où. – yizzlez

+0

@chris Pourquoi 'operator <<' ne devrait-il pas être une fonction amie? Je pensais que puisque le premier paramètre de la fonction est un ostream, je devrais faire de la fonction un ami pour modifier directement les variables membres d'un objet Date – AmitS

Répondre

0

Vous avez une incompatibilité d'espaces de noms. Dans l'en-tête, vous n'utilisez pas le préfixe d'espace de noms std avant string, par conséquent le compilateur ne peut pas trouver le type string dont vous avez besoin.

+0

Je me demande ce que les horreurs sont dans le fichier principal ou un autre. – chris

+0

Cependant, 'ofstream' est bien. Vraiment me fait me demander ... – yizzlez

+0

@awesomeyi 'ofstream' est utilisé par référence dans l'en-tête et l'accès réel à ses internes se produit après l'implémentation' toString'. Peut-être que le compilateur est plus facile avec les types de référence et ne tente pas de les évaluer avant l'utilisation réelle (ou l'OP n'inclut pas d'autres erreurs ...) – SomeWittyUsername