不能设置ostringstream对象的streambuf
Cannot set the streambuf of an ostringstream object
我想在我的程序中包含一些std::ostringstream
对象,用于日志记录和错误报告。根据编译时给出的设置,日志和错误流要么收集它们各自的数据(要保存或其他),要么将它们重定向到std::cout
和std::cerr
(用于调试目的)。据我所知,从我所看到的引用(和这里),std::ostringstream
对象继承了rdbuf()
方法,我应该能够在流对象上调用rdbuf()
方法,作为参数传递一个指向std::streambuf
的指针以与流关联。
然而,当我尝试编译时,我收到一个没有匹配函数调用的错误,rdbuf()
方法没有任何参数被列为候选。
我从g++ (Ubuntu 12.04 x86_64上的4.6.3)得到的错误:
<>之前sigma@SigmaSys:~/Scripts/http/test$ g++ test。Cc -c -o测试测试。cc:在构造函数' Logger::Logger() '中:测试。Cc:23:43:错误:没有匹配的函数调用' std::basic_ostringstream::rdbuf(std::basic_streambuf*) '测试。抄送:23:43:备注:候选人为:/usr/include/c++/4.6/sstream:449:7: note: std::basic_ostringstream::__stringbuf_type* std::basic_ostringstream::rdbuf() const [with _CharT = char, _Traits = std::char_traits, _Alloc = std::allocator, std::basic_ostringstream::__stringbuf_type = std:: basic_stringbuf_type = std::basic_stringbuf]/usr/include/c++/4.6/sstream:449:7:注意:候选人期望0个参数,提供1个之前以下是源代码和头文件的精简版本:
http_utils.h
#include <string>
#include <sstream>
#include <streambuf>
#define HTTP_DEBUG_MODE 1
class Logger {
private:
static std::ostringstream errOut;
static std::ostringstream logOut;
static std::streambuf* cerrStreamBuffBackup;
static std::streambuf* coutStreamBuffBackup;
static std::streambuf* errOutStreamBuffBackup;
static std::streambuf* logOutStreamBuffBackup;
public:
Logger();
~Logger();
};
http_utils。cc
#include "test.h"
#include <string>
#include <iostream>
#include <sstream>
#include <streambuf>
std::ostringstream Logger::errOut;
std::ostringstream Logger::logOut;
std::streambuf* Logger::cerrStreamBuffBackup = NULL;
std::streambuf* Logger::coutStreamBuffBackup = NULL;
std::streambuf* Logger::errOutStreamBuffBackup = NULL;
std::streambuf* Logger::logOutStreamBuffBackup = NULL;
Logger::Logger() {
if (HTTP_DEBUG_MODE) {//Redirect logging/error to stdout/stderr
Logger::errOutStreamBuffBackup = Logger::errOut.rdbuf();
Logger::logOutStreamBuffBackup = Logger::logOut.rdbuf();
Logger::errOut.rdbuf( std::cerr.rdbuf() );
Logger::logOut.rdbuf( std::cout.rdbuf() );
} else {//Redirect stdout/stderr to custom logging/error functionality
cerrStreamBuffBackup = std::cerr.rdbuf();
coutStreamBuffBackup = std::cout.rdbuf();
std::cerr.rdbuf( errOut.rdbuf() );
std::cout.rdbuf( logOut.rdbuf() );
}
}
Logger::~Logger() {
if (HTTP_DEBUG_MODE) {
} else {//Restore stdout/stderr streambuf
std::cerr.rdbuf( Logger::cerrStreamBuffBackup );
std::cout.rdbuf( Logger::coutStreamBuffBackup );
}
}
如果有人能帮我解决这个问题,或者给我一个替代方法的建议,我将不胜感激。
std::ostringstream
对象继承了rdbuf()
方法,我应该能够在流对象上调用rdbuf()
方法,将指向std::streambuf
的指针作为参数传递给流。
根据Liskov替换原理,你应该这样做,但是你不能。
std::basic_stringstream::rdbuf
隐藏std::basic_ios::rdbuf()
的两个签名。你可以用一些丑陋的cast来调用它们,但我认为这不会有任何效果。stringstream总是保证写入字符串缓冲区
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 如何返回一个类的两个对象相加的结果
- 使用std::函数映射对象方法
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 将 boost 序列化对象的 asio::streambuf 表示转换为 Beast 的 DynamicBody req.body()
- cout 对象的 streambuf 是如何初始化的?
- 不能设置ostringstream对象的streambuf