7

有人能帮我吗?

我正在尝试执行以下操作:

#include <boost/iostreams/tee.hpp>
#include <boost/iostreams/stream.hpp>
#include <sstream>  
#include <cassert>  

namespace io = boost::iostreams;
typedef io::stream<io::tee_device<std::stringstream, std::stringstream> > Tee;
std::stringstream ss1, ss2;
Tee my_split(ss1, ss2); // redirects to both streams
my_split << "Testing";
assert(ss1.str() == "Testing" && ss1.str() == ss2.str());

但它不会在 VC9 中编译:

c:\lib\boost_current_version\boost\iostreams\stream.hpp(131) : error C2665: 'boost::iostreams::tee_device<Sink1,Sink2>::tee_device' : none of the 2 overloads could convert all the argument types

有没有人让这个工作?我知道我可以让自己的班级去做,但我想知道我做错了什么。

谢谢

4

2 回答 2

12

您使用 的构造函数转发版本io::stream它自己构造一个 tee-stream 并将所有参数转发给它。C++03 在将参数转发给函数时只有有限的能力(需要的重载数量很容易成倍增长)。它 ( io::stream) 做出以下限制:

这些成员中的每一个都构造一个流实例,并将它与从给定参数列表构造的设备 T 的实例相关联。涉及的 T 构造函数必须通过值或 const 引用获取所有参数。

好吧,但是tee_device构造函数说

根据给定的一对接收器构造 tee_device 的实例。如果相应的模板参数是流或流缓冲区类型,则每个函数参数都是非 const 引用,否则是 const 引用。

这当然行不通。io::stream提供了另一个以 aT作为第一个参数的构造函数。这在这里有效(至少编译。但断言失败。我没有使用过,boost::iostreams所以我无能为力)

namespace io = boost::iostreams;
typedef io::tee_device<std::stringstream, std::stringstream> TeeDevice;
typedef io::stream< TeeDevice > TeeStream;
std::stringstream ss1, ss2;
TeeDevice my_tee(ss1, ss2); 
TeeStream my_split(my_tee);
my_split << "Testing";
assert(ss1.str() == "Testing" && ss1.str() == ss2.str());

编辑:调用flush()或流式处理后<< std::flush,断言通过。

于 2009-03-22T03:29:41.937 回答
2

可能您需要像这样设置它:

typedef io::tee_device<std::stringstream, std::stringstream> Tee;
typedef io::stream<Tee> TeeStream;

std::stringstream ss1, ss2;
Tee my_tee(ss1, ss2);
TeeStream my_split(my_tee);
于 2009-03-22T03:02:33.203 回答