gpt4 book ai didi

C++ 如何初始化 std::istream* 尽管构造函数受到保护

转载 作者:太空狗 更新时间:2023-10-29 20:42:27 26 4
gpt4 key购买 nike

我想使用带有流成员的类。

我的代码是这样的:

//! pushes a Source and InputFilters into a filtering_istream
class FilterChain {
public:
//! create an empty FilterChain
FilterChain(){
init();
}

private:
//! the stream to connect Source and InputFilters together
io::filtering_istream* m_filteringStream;
//! stream to use by other classes
std::istream* m_stream;

void init(){
std::streambuf* streamBuffer = m_filteringStream->rdbuf();
m_stream->rdbuf(streamBuffer);
}
};

我收到一条错误消息,指出 std::basic_istream 构造函数 protected :

/usr/include/c++/4.8.1/istream: In member function `void FilterChain::init()': /usr/include/c++/4.8.1/istream:606:7: Error: `std::basic_istream<_CharT, _Traits>::basic_istream() [with _CharT = char; _Traits = std::char_traits]' is protected

我也尝试了流引用,但那导致了同样的错误。有什么解决办法吗?

编辑 1:

感谢 sehe 我用这样的新 init() 修复了它:

void init(){
std::streambuf* streamBuffer = m_filteringStream->rdbuf();
m_stream = new std::istream(streamBuffer);
}

最佳答案

您显示的代码实际上根本不包含问题。

问题是您正在尝试在某处(不在您的问题代码中)默认构造一个 istream 对象。

至少需要一个缓冲区来初始化它:

std::filebuf  m_dummy;
std::istream m_stream(&dummy);

现在,您可以像以前一样重新分配 rdbuf。另见,例如How can I switch between fstream files without closing them (Simultaneous output files) - C++

更新 正如 Dietmar 刚刚确认的那样,您可以为 streambuf* 参数传递一个 nullptr:

std::istream  m_stream(nullptr);

关于C++ 如何初始化 std::istream* 尽管构造函数受到保护,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18443793/

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