2010-05-07 14 views
5

je voudrais lier l'opérateur de flux < <:boost :: bind et << opérateur en C++

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

Malheureusement, il ne fonctionne pas:

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 

Qu'est-ce que je fais mal?

Répondre

8

Au lieu de cela, vous pouvez essayer boost.lambda:

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

La raison de votre problème est très probablement: comment diable pouvez-vous attendre le compilateur/bind pour savoir ce que vous prenez l'adresse de si vous dites &operator<<? (Je reçois une autre erreur en disant simplement que ce ne soit pas déclarée.)


Si vous voulez vraiment faire avec bind, vous auriez à dire que ce qui operator<< que vous voulez utiliser, par exemple, en supposant int (vous aurez également besoin de savoir, l'opérateur est surchargé en tant que membre ou fonction gratuite):

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

Vous pouvez probablement utiliser ostream_iterator à la place:

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