我正在尝试熟悉使用boost :: iostreams。看看iostreams教程,看来这个测试代码应该是一个简单的宿设备实现和流模板:
#include <iostream>
#include <iosfwd>
#include <boost/iostreams/categories.hpp>
#include <boost/iostreams/stream.hpp>
#include <boost/iostreams/concepts.hpp>
namespace io = boost::iostreams;
class testSink {
public:
typedef char char_type;
typedef io::sink_tag category;
std::streamsize write(const char* s, std::streamsize n) {
std::cout.write(s, n);
return n;
}
};
int main(int argc, char *argv[])
{
io::stream<testSink> out;
out << "Hello" << std::endl;
return EXIT_SUCCESS;
}
在linux和g ++(g ++(GCC)4.8.5 20150623(Red Hat 4.8.5-16))下编译成功没有错误,但运行它会因断言失败而崩溃:
/usr/local/include/boost/iostreams/detail/optional.hpp:55:T&amp; boost :: iostreams :: detail :: optional :: operator *()[with T = boost :: iostreams :: detail :: concept_adapter]:断言`initialized_'失败。 中止(核心倾销)
显然有一些未记录的初始化步骤,但是什么?
由于
答案 0 :(得分:0)
缺少的初始化步骤是调用“open”。提升文档似乎不太清楚 - 我从阅读源代码中得出结论。事实上,我正在使用的文档(1.55)中的示例遇到了与您面临的问题相同的问题。
以下是我为你修改testSink的方法:我添加了一个构造函数,它接受一个ostream的引用,然后将std :: cout传递给open()方法。
class testSink {
public:
typedef char char_type;
typedef io::sink_tag category;
testSink(std::ostream &out) : out_(out) { }
std::streamsize write(const char* s, std::streamsize n) {
out_.write(s, n);
return n;
}
private:
std::ostream& out_;
};
然后这是主要功能:
io::stream<testSink> out;
out.open(std::cout);
out << "Hello" << std::endl;
答案 1 :(得分:0)
我遇到了同样的问题,调用non-default constructor of the stream object传递一个接收器对象解决了这个问题(根据文档,非默认构造函数创建了一个准备执行I / O的流)。
因此,您的示例对主要功能进行了以下更改:
int main(int argc, char *argv[])
{
testSink t;
io::stream<testSink> out(t); // <---- call non-default constructor passing a testSink object
out << "Hello" << std::endl;
return EXIT_SUCCESS;
}
下面是在Coliru上运行的示例。