Вопрос

Кто-нибудь может мне помочь?

Я пытаюсь сделать что-то вроде следующего:

#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

Кто-нибудь заставил это работать?Я знаю, что могу создать для этого свой собственный класс, но я хочу знать, что я делаю неправильно.

Спасибо

Это было полезно?

Решение

Вы используете версия с пересылкой конструктора из io::stream, который сам создает тройник и пересылает ему все аргументы.C++03 имеет лишь ограниченные возможности, когда дело доходит до пересылки аргументов функциям (количество необходимых перегрузок легко растет в геометрической прогрессии).Это (io::stream) накладывает следующие ограничения:

Каждый из этих членов создает экземпляр потока и связывает его с экземпляром устройства T, созданным на основе заданных списков аргументов. Задействованные конструкторы T должны принимать все аргументы по значению или константной ссылке.

Ну, но tee_device конструктор говорит

Создает экземпляр tee_device на основе заданной пары приемников.Каждый параметр функции является неконстантной ссылкой, если соответствующий аргумент шаблона является потоком или типом буфера потока, и константной ссылкой в ​​противном случае.

Это, конечно, не сработает. io::stream предоставляет еще один конструктор, который принимает T в качестве первого аргумента.Здесь это работает (по крайней мере, компилируется.Однако это утверждение несостоятельно.я не работал с 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, утверждение проходит.

Другие советы

Наверное нужно настроить так:

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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top