Question

Quelqu'un peut-il me aider?

Je suis en train de faire quelque chose comme ce qui suit:

#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());

Mais il ne compilera pas dans 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

Quelqu'un at-il eu que cela fonctionne? Je sais que je pourrais faire ma propre classe de le faire, mais je veux savoir ce que je fais mal.

Merci

Était-ce utile?

La solution

Vous utilisez le constructeur-expédition la version de io::stream, qui construisent un cours d'eau de départ lui-même et transmettre tous les arguments à ce sujet. C ++ 03 a seulement des capacités limitées en matière de transmission des arguments aux fonctions (quantité de croître facilement nécessaires surcharges de façon exponentielle). Il (tee_device) fait les restrictions suivantes:

  

Chacun de ces membres construit une instance de flux et l'associe avec une instance de l'appareil T construit à partir des listes d'arguments donnés. Les T constructeurs concernés doivent prendre tous les arguments par valeur ou référence const.

Eh bien, mais le constructeur dit T

  

Crée une occurrence tee_device basée sur la même paire de puits. Chaque paramètre de fonction est une référence non-const si l'argument de modèle correspondant est un type de mémoire tampon de flux ou courant, et une référence const autrement.

Cela ne marchera pas, bien sûr. Fournit un autre constructeur boost::iostreams qui prend comme premier argument flush(). Cela fonctionne ici (Compile, au moins. L'assertion échoue, cependant. Je n'ai pas travaillé avec << std::flush donc je ne peux pas aider à cela)

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());

Edit: Après avoir appelé le streaming ou <=> <=>, l'affirmation passe.

Autres conseils

Vous avez probablement besoin de le configurer comme ceci:

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top