2010-05-07 7 views
5

vorrei legare l'operatore < < flusso:boost :: bind e << operatore in C++

for_each(begin, end, boost::bind(&operator<<, stream, _1)); 

Purtroppo non funziona:

Error 1 error C2780: 'boost::_bi::bind_t<_bi::dm_result<MT::* ,A1>::type,boost::_mfi::dm<M,T>,_bi::list_av_1<A1>::type> boost::bind(M T::* ,A1)' : expects 2 arguments - 3 provided c:\source\repository\repository\positions.cpp 90 

Che cosa sto facendo di sbagliato?

risposta

8

Invece si potrebbe provare boost.lambda:

//using namespace boost::lambda; 
for_each(begin, end, stream << _1)); 

La ragione del problema è molto probabilmente: come diavolo si può aspettare il compilatore/legare per sapere cosa stai prendendo l'indirizzo se dici &operator<<? (Ottengo un altro errore dicendo semplicemente che questo non è dichiarato.)


Se si vuole veramente farlo con bind, dovreste dirgli che operator<< che si desidera utilizzare, ad esempio, assumendo int (avrete anche bisogno di sapere, che l'operatore è sovraccarico come membro o una funzione gratuita):

bind(static_cast<std::ostream& (std::ostream::*)(int)>(&std::ostream::operator<<), ref(std::cout), _1) 
5

Probabilmente si può utilizzare al posto ostream_iterator:

vector<int> V; 
// ... 
copy(V.begin(), V.end(), ostream_iterator<int>(cout, "\n")); 
Problemi correlati