gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 16:05:52 24 4
gpt4 key购买 nike

假设我有一个 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\消息缓冲区.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;
}

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

最佳答案

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

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

关于c++ - 如何重载 ostream 运算符 << 以使其与 C++ 中的 log4cxx 一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5990898/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com