mis*_*why 10 c++ operator-overloading log4cxx
假设我有一个类A和一个运算符<<声明如下:
// A.h
class A
{
// A stuff
};
std::ostream& operator<<(std::ostream& os, const A& a);
Run Code Online (Sandbox Code Playgroud)
在其他地方我用A记录器:
LoggerPtr logger(LogManager::getLogger("ThisObject"));
A a;
LOG4CXX_INFO(logger, "A: " << a);
Run Code Online (Sandbox Code Playgroud)
编译器抱怨:二进制'<<':找不到运算符,它采用类型'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;
}
Run Code Online (Sandbox Code Playgroud)
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); }}
Run Code Online (Sandbox Code Playgroud)
MessageBuffer "定义"此运算符:
// messagebuffer.h
template<class V>
std::ostream& operator<<(MessageBuffer& os, const V& val) {
return ((std::ostream&) os) << val;
}
Run Code Online (Sandbox Code Playgroud)
我不明白如何使这个操作符重载正确的方法使其工作.任何的想法?
您可以尝试在命名空间std中声明运算符<<(这是合法的,因为您传递的是用户定义类型的实例):
namespace std {
ostream& operator<<(ostream& os, const A& a);
}
Run Code Online (Sandbox Code Playgroud)