假设我有一个 A 类和一个 operator<< 声明如下:
// 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);
编译器抱怨:二进制 '<<' : no operator found 采用 'const A' 类型的右手操作数(或没有可接受的转换) D:\dev\cpp\lib\apache-log4cxx\log4cxx\包括\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;
}
我不明白如何以正确的方式重载此运算符以使其工作。任何的想法?