Decir que tengo una clase A y un operador < < declarado así:Cómo sobrecargar el operador ostream << para que funcione con log4cxx en C++?
// A.h
class A
{
// A stuff
};
std::ostream& operator<<(std::ostream& os, const A& a);
en otro lugar que uso mi registrador con A:
LoggerPtr logger(LogManager::getLogger("ThisObject"));
A a;
LOG4CXX_INFO(logger, "A: " << a);
El compilador se queja: binaria '< < ': no se ha encontrado ningún operador que tome un operando de la mano derecha del tipo' const A '(o no hay una conversión aceptable) D: \ dev \ cpp \ lib \ apache-log4cxx \ log4cxx \ include \ log4cxx \ helpers \ messagebuffer.h 190
Este error me lleva a la declaración de la operator<<
:
// messagebuffer.h
template<class V>
std::basic_ostream<char>& operator<<(CharMessageBuffer& os, const V& val) {
return ((std::basic_ostream<char>&) os) << val;
}
LOG4XX_INFO
macro se expande a:
#define LOG4CXX_INFO(logger, message) { \
if (logger->isInfoEnabled()) {\
::log4cxx::helpers::MessageBuffer oss_; \
logger->forcedLog(::log4cxx::Level::getInfo(), oss_.str(oss_ << message), LOG4CXX_LOCATION); }}
MessageBuffer
"define" operador así:
// messagebuffer.h
template<class V>
std::ostream& operator<<(MessageBuffer& os, const V& val) {
return ((std::ostream&) os) << val;
}
I no entiendo cómo sobrecargar este operador de la manera correcta para hacerlo funcionar. ¿Alguna idea?
¿Qué compilador? –
@ Alan Stokes: Estoy usando Visual Studio 2010 –
Trate de incluir A.h antes messagebuffer.h –