سؤال

ويمكن للشخص مساعدتي؟

وأنا أحاول أن تفعل شيئا مثل ما يلي:

#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 المعنية أن تتخذ جميع الحجج من حيث القيمة أو إشارة CONST.

حسنا، ولكن المنشئ tee_device يقول

<اقتباس فقرة>   

ويبني مثيل tee_device بناء على زوج معين من المصارف. كل معلمة وظيفة هي إشارة غير CONST إذا كانت الوسيطة قالب المقابلة هو نوع تيار أو تيار العازلة، وإشارة CONST خلاف ذلك.

وهذا لن تعمل، بطبيعة الحال. يوفر 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