如何重载ostream运算符<<使其与 C++ 中的 log4cxx 一起工作?

发布于 2024-11-07 00:56:57 字数 1365 浏览 2 评论 0 原文

假设我有一个 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;
}

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

Say I have a class A and an operator<< declared like so:

// A.h
class A
{
    // A stuff
};
std::ostream& operator<<(std::ostream& os, const A& a);

somewhere else I use my logger with A:

LoggerPtr logger(LogManager::getLogger("ThisObject"));
A a;
LOG4CXX_INFO(logger, "A: " << a);

The compiler is complaining:
binary '<<' : no operator found which takes a right-hand operand of type 'const A' (or there is no acceptable conversion) D:\dev\cpp\lib\apache-log4cxx\log4cxx\include\log4cxx\helpers\messagebuffer.h 190

This error takes me to the declaration of the 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 macro expands to:

#define LOG4CXX_INFO(logger, message) { \
    if (logger->isInfoEnabled()) {\
       ::log4cxx::helpers::MessageBuffer oss_; \
       logger->forcedLog(::log4cxx::Level::getInfo(), oss_.str(oss_ << message), LOG4CXX_LOCATION); }}

MessageBuffer "defines" this operator as well:

// messagebuffer.h
template<class V>
std::ostream& operator<<(MessageBuffer& os, const V& val) {
    return ((std::ostream&) os) << val;
}

I don't understand how to overload this operator the right way to make it work. Any idea?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

离不开的别离 2024-11-14 00:56:57

您可以尝试声明您的运算符 <<在名称空间 std 中(这是合法的,因为您传递的是用户定义类型的实例):

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

You could try declaring your operator << in namespace std (that's legal, since you're passing an instance of your user-defined type):

namespace std {
   ostream& operator<<(ostream& os, const A& a);
}
栖竹 2024-11-14 00:56:57

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

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

Alan's suggestion of putting the user-defined operator in the std namespace works. But I prefer putting the user-defined operator in the log4cxx::helpers namespace, which also works. Specifically,

namespace log4cxx { namespace helpers {
    ostream& operator<<(ostream& os, const A& a);
} }
↘人皮目录ツ 2024-11-14 00:56:57

我现在没有可用的编译器,但我认为问题是由于尝试在常量字符串上使用插入运算符引起的。 <代码>“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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文