說我有A級和運營商宣佈像這樣< <:如何重載ostream運算符<<以使其在C++中使用log4cxx?
// A.h
class A
{
// A stuff
};
std::ostream& operator<<(std::ostream& os, const A& a);
別的地方我用我的記錄器使用A:
LoggerPtr logger(LogManager::getLogger("ThisObject"));
A a;
LOG4CXX_INFO(logger, "A: " << a);
編譯器抱怨: 二進制「< < ':找不到操作符,它的右手操作數是'const A'(或者沒有可接受的轉換)D:\ dev \ cpp \ lib \ apache-log4cxx \ log4cxx \ include \ log4cxx \ helpers \ messagebuffer.h 190
此錯誤帶我到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
宏展開:
#define LOG4CXX_INFO(logger, message) { \
if (logger->isInfoEnabled()) {\
::log4cxx::helpers::MessageBuffer oss_; \
logger->forcedLog(::log4cxx::Level::getInfo(), oss_.str(oss_ << message), LOG4CXX_LOCATION); }}
MessageBuffer
「定義」 這個操作符,以及:
// messagebuffer.h
template<class V>
std::ostream& operator<<(MessageBuffer& os, const V& val) {
return ((std::ostream&) os) << val;
}
我不明白如何以正確的方式使運營商超負荷工作。任何想法?
哪個編譯器? – 2011-05-13 11:09:58
@Alan Stokes:我正在使用Visual Studio 2010 – 2011-05-13 11:20:52
嘗試在messagebuffer.h之前添加A.h – 2011-05-13 12:18:37