【发布时间】:2011-05-13 10:58:54
【问题描述】:
假设我有一个 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);
编译器抱怨: 二进制 '
这个错误将我带到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;
}
我不明白如何以正确的方式重载此运算符以使其工作。有什么想法吗?
【问题讨论】:
-
@Alan Stokes:我正在使用 Visual Studio 2010
-
尝试在 messagebuffer.h 之前包含 A.h
-
@Juraj Blaho:你认为为什么会这样?在编译器执行它的查找时,我的操作符被完美地定义和知道了。
-
@mister 为什么:错误消息表明它不知道/不可见。
-
@Juraj Blaho:确实如此,但我认为这与错误指向一个特殊的
operator<<的事实有关,该CharMessageBuffer采用CharMessageBuffer而不是ostream。我不想在我的类中引入 log4cxx 实现依赖。
标签: c++ operator-overloading log4cxx