J'ai lu des tonnes de questions, d'articles et de documentation, mais je n'ai pas trouvé de solution à mon problème.Classe de journalisation wostream simple (avec des manipulateurs de flux personnalisés)
Je voudrais créer une classe simple à utiliser pour le débogage. Le résultat final de ce qui me permettrait de faire quelque chose comme ceci:
logger << error << L"This is a problem!" << endl;
logger << warning << L"This might be a problem!" << endl;
logger << info << L"This isn't a problem but I thought you should know about it" << endl;
Avec l'idée que, dans la classe de l'enregistreur que je peux basculer si oui ou non ces choses font à la console/fichier de débogage. J'ai un squelette ensemble, mais je n'arrive pas à obtenir une surcharge de l'opérateur pour que les manipulateurs fonctionnent correctement.
Voilà Logger.h:
class LoggerBuffer : public wfilebuf {
// Functions
public:
LoggerBuffer() { wfilebuf::open("NUL", ios::out); currentState = 1;}
~LoggerBuffer() {wcout << "DELETED!" << endl;}
void open(const char fname[]);
void close() {wfilebuf::close();}
virtual int sync();
void setState(int newState);
// Variables
private:
int currentState;
};
class LoggerStream : public wostream {
// Functions
public:
LoggerStream() : wostream(new LoggerBuffer()), wios(0) {}
~LoggerStream() { delete rdbuf(); }
void open(const char fname[] = 0) {
wcout << "Stream Opening " << fname << endl;((LoggerBuffer*)rdbuf())->open(fname); }
void close() { ((LoggerBuffer*)rdbuf())->close(); }
void setState(int newState);
};
Et Logger.cpp:
void LoggerBuffer::open(const char fname[]) {
wcout << "Buffer Opening " << fname << endl;
close();
wfilebuf* temp = wfilebuf::open(fname, ios::out);
wcout << "Temp: " << temp << endl;
}
int LoggerBuffer::sync() {
wcout << "Current State: " << currentState << ", Data: " << pbase();
return wfilebuf::sync();
}
void LoggerBuffer::setState(int newState) {
wcout << "New buffer state = " << newState << endl;
currentState = newState;
}
void LoggerStream::setState(int newState) {
wcout << "New stream state = " << newState << endl;
((LoggerBuffer*)rdbuf())->setState(newState);
}
Et main.cpp:
struct doSetState {
int _l;
doSetState (int l): _l (l) {}
friend LoggerStream& operator<< (LoggerStream& os, doSetState fb) {
os.setState(3);
return (os);
}
};
...
LoggerStream test;
test.open("debug.txt");
test << "Setting state!" << doSetState(1) << endl;
...
Ce gâchis produit l'erreur suivante dans VS2005:
"erreur C2679: binaire '< <': aucun opérateur trouvée, ce qui prend un opérande à droite de type 'doSetState' (ou il n'y a pas conversion acceptable)"
Toute aide est FORTEMENT apprécié.
Merci!
J'apprécie votre aide mais même avec ce changement j'obtenir exactement la même erreur. – RotsiserMho