Вы используете версию перенаправления конструктора из io::stream
, которая сама создает поток tee и передает все аргументы этому. 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
утверждение проходит.