如何重载ostream运算符<<使它在C ++中使用log4cxx?

时间:2011-05-13 10:58:55

标签: c++ operator-overloading log4cxx

假设我有一个A类和一个运算符<<宣布如此:

// 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);

编译器抱怨: 二进制'&lt;&lt;' :找不到哪个操作符采用'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;
}

我不明白如何以正确的方式使该运算符超载以使其工作。有什么想法吗?

3 个答案:

答案 0 :(得分:7)

您可以尝试声明您的运营商&lt;&lt;在命名空间std中(这是合法的,因为你传递的是用户定义类型的实例):

namespace std {
   ostream& operator<<(ostream& os, const A& a);
}

答案 1 :(得分:2)

Alan建议将用户定义的运算符放在std命名空间中。但我更喜欢将用户定义的运算符放在log4cxx::helpers命名空间中,这也适用。具体来说,

namespace log4cxx { namespace helpers {
    ostream& operator<<(ostream& os, const A& a);
} }

答案 2 :(得分:0)

我现在没有可用的编译器,但我认为问题是由于尝试在常量字符串上使用insert运算符引起的。 "A: " << a