2009-08-14 9 views
3

J'essaie d'utiliser Boost :: bind et std :: copy pour imprimer les valeurs dans une liste de listes. Évidemment, je pourrais utiliser des boucles, et je pourrais finir par le faire par souci de clarté, mais j'aimerais quand même savoir ce que je fais de mal ici.Boost :: bind et std :: copy

Voici la version distillée de mon code:

#include <boost/bind.hpp> 
#include <iterator> 
#include <algorithm> 
#include <list> 
#include <iostream> 
using namespace std; 
using namespace boost; 

int main(int argc, char **argv){ 
list<int> a; 
a.push_back(1); 

list< list<int> > a_list; 
a_list.push_back(a); 

ostream_iterator<int> int_output(cout,"\n"); 

for_each(a_list.begin(),a_list.end(), 
    bind(copy, 
    bind<list<int>::iterator>(&list<int>::begin,_1), 
    bind<list<int>::iterator>(&list<int>::end,_1), 
    ref(int_output) 
) //compiler error at this line 
); 
return 0; 

}

L'erreur du compilateur commence

error: no matching function call to bind(<unresolved overloaded function type> ..... 

Je pense que cela signifie que bind ne peut pas comprendre ce que le Le type de retour pour la liaison externe doit être. Je ne le blâme pas, parce que je ne peux pas non plus. Des idées?

Répondre

6

Les arguments de modèle à std::copy ne peuvent pas être déduits dans le contexte de l'appel de liaison. Vous devez les spécifier explicitement:

copy< list<int>::iterator, ostream_iterator<int> > 

également lorsque vous écrivez:

for_each(a_list.begin().a_list.end(), 

Je pense que vous voulez dire:

for_each(a_list.begin(),a_list.end(), 

Et vous manquez #include <iostream> pour la définition de std::cout.

+0

J'ai corrigé l'iostream et., Les erreurs. –

+0

Fonctionne parfaitement. Merci! –

3

Une façon de résoudre ce problème qui peut générer du code plus clair est d'oublier Boost :: lier tout à fait et définir un foncteur:

struct print_int_list : public unary_function<list<int>, void> 
{ 
    void operator()(list<int> b) 
    { 
    copy(b.begin(),b.end(),ostream_iterator<int>(cout,"\n")); 
    } 
}; 

et juste faire

for_each(a_list.begin(),a_list.end(),print_int_list()); 

Boost :: bind C'est génial mais parfois je dois résister à l'envie de l'utiliser dans des endroits où des alternatives plus simples génèrent du code plus clair.

+1

+1 pour votre dernier paragraphe. Vous pouvez gravement nuire à la lisibilité en surchargeant boost :: bind et vos amis. –

Questions connexes