Details
-
Bug
-
Status: Resolved
-
Major
-
Resolution: Fixed
-
0.10.0
-
None
-
None
-
FC4 - g++ (GCC) 4.0.2 20051125
Description
This is one of those strange nuances of C++ (or maybe just GCC). logstream's << operators don't work from within a namespace that has operator<< defined. For example:
#include <log4cxx/logger.h>
#include <log4cxx/stream.h>
#include <ostream>
namespace foo
{
class Bar
;
std::ostream &operator<<(std::ostream &o, Bar const &b)
{ return o << "Bar"; }}
using namespace foo;
namespace
{
log4cxx::LoggerPtr logger(log4cxx::Logger::getLogger("foo"));
log4cxx::logstream lout(logger, log4cxx::Level::DEBUG);
}
void Bar::fn()
{
lout << "hi" << LOG4CXX_ENDMSG;
}
Compiles with the following error:
g++ -c -o log4cxx-ns.o log4cxx-ns.cpp
log4cxx-ns.cpp: In member function 'void foo::Bar::fn()':
log4cxx-ns.cpp:29: error: no match for 'operator<<' in '<unnamed>::lout << "hi"'
log4cxx-ns.cpp:12: note: candidates are: std::ostream& foo::operator<<(std::ostream&, const foo::Bar&)
For the Koenig lookup to work properly, the operator<< functions need to be defined in the log4cxx namespace.