如何重载ostream运算符<<使其与 C++ 中的 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);
编译器抱怨: 二进制 '<<' :找不到采用“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;
}
我不明白如何以正确的方式重载这个运算符以使其工作。有什么想法吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以尝试声明您的运算符 <<在名称空间 std 中(这是合法的,因为您传递的是用户定义类型的实例):
You could try declaring your operator << in namespace std (that's legal, since you're passing an instance of your user-defined type):
Alan 将用户定义的运算符放入
std
命名空间的建议是可行的。但我更喜欢将用户定义的运算符放在log4cxx::helpers
命名空间中,这也有效。具体来说,Alan's suggestion of putting the user-defined operator in the
std
namespace works. But I prefer putting the user-defined operator in thelog4cxx::helpers
namespace, which also works. Specifically,我现在没有可用的编译器,但我认为问题是由于尝试在常量字符串上使用插入运算符引起的。 <代码>“A:”<<一个
I don't have a compiler available right now but i think the problem is caused by trying to use insert operator on a constant string.
"A: " << a