Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1821 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Résolu - Soucis avec boost::bind

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Résolu - Soucis avec boost::bind

n°1894383
superbob56
Posté le 12-06-2009 à 10:54:15  profilanswer
 

J'ai le code suivant :

Code :
  1. void displayEl(ostream &os, pair<string, string> el) {
  2. os << el.first << " = " << el.second << endl;
  3. }
  4. ostream& operator<< (ostream &os, const Config& config) {
  5. for_each<map<string, string>::const_iterator>(
  6.   config._params.begin(),
  7.   config._params.end(),
  8.   boost::bind(
  9.     &displayEl,
  10.     os,
  11.     _1));
  12. return os;
  13. }


 
Et le compilo me sort l'erreur suivante :

c:\mingw\bin\../lib/gcc/mingw32/4.3.0/include/c++/bits/ios_base.h: In copy constructor 'std::basic_ios<char, std::char_traits<char> >::basic_ios(const std::basic_ios<char, std::char_traits<char> >& )':
c:\mingw\bin\../lib/gcc/mingw32/4.3.0/include/c++/bits/ios_base.h:783: error: 'std::ios_base::ios_base(const std::ios_base& )' is private
c:\mingw\bin\../lib/gcc/mingw32/4.3.0/include/c++/iosfwd:52: error: within this context
c:\mingw\bin\../lib/gcc/mingw32/4.3.0/include/c++/iosfwd: In copy constructor 'std::basic_ostream<char, std::char_traits<char> >::basic_ostream(const std::basic_ostream<char, std::char_traits<char> >& )':
c:\mingw\bin\../lib/gcc/mingw32/4.3.0/include/c++/iosfwd:61: note: synthesized method 'std::basic_ios<char, std::char_traits<char> >::basic_ios(const std::basic_ios<char, std::char_traits<char> >& )' first required here  
..\src\Config.cpp: In function 'std::ostream& operator<<(std::ostream&, const Config& )':
..\src\Config.cpp:113: note: synthesized method 'std::basic_ostream<char, std::char_traits<char> >::basic_ostream(const std::basic_ostream<char, std::char_traits<char> >& )' first required here  
..\src\Config.cpp:113: error:   initializing argument 2 of 'boost::_bi::bind_t<R, R (*)(B1, B2), typename boost::_bi::list_av_2<A1, A2>::type> boost::bind(R (*)(B1, B2), A1, A2) [with R = void, B1 = std::ostream&, B2 = std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, A1 = std::basic_ostream<char, std::char_traits<char> >, A2 = boost::arg<1>]'
Build error occurred, build is stopped


Si je comprends bien, le problème vient de boost::bind, car il 'comprends' que mon premier argument de la fonction est un 'ostream' et comme ostream n'est pas copiable (copy constructor privé) ça plante, alors que ça devrait être un 'ostream &'.
Je ne sais pas pourquoi il comprends ostream et pas ostream &. Sachant que le paramètre utilisé (os) est à la base un 'ostream &'.
 
J'ai essayé en précisant les arguments de templates comme ceci :

Code :
  1. boost::bind<void (*)(ostream&, pair<string, string> ), ostream&, _1>(
  2.     &displayEl,
  3.     os,
  4.     _1));


Mais il ne comprends plus rien et me dit ça :

..\src\Config.cpp: In function 'std::ostream& operator<<(std::ostream&, const Config& )':
..\src\Config.cpp:113: error: no matching function for call to 'bind(void (*)(std::ostream&, std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > ), std::basic_ostream<char, std::char_traits<char> >&, boost::arg<1>& )'
Build error occurred, build is stopped


Donc voilà, je suis un peu paumé ... :s


Message édité par superbob56 le 12-06-2009 à 16:01:25

---------------
By bob.
mood
Publicité
Posté le 12-06-2009 à 10:54:15  profilanswer
 

n°1894416
Amonchakai
Posté le 12-06-2009 à 12:01:30  profilanswer
 

Hello,
 
 
Pour passer un objet par référence dans boost:bind il faut utiliser un boost::ref  
 
Tu as des exemples dans la doc de boost::bind -> http://www.boost.org/doc/libs/1_39 [...] /bind.html

n°1894561
superbob56
Posté le 12-06-2009 à 15:59:21  profilanswer
 

Amonchakai a écrit :

Hello,
 
 
Pour passer un objet par référence dans boost:bind il faut utiliser un boost::ref  
 
Tu as des exemples dans la doc de boost::bind -> http://www.boost.org/doc/libs/1_39 [...] /bind.html


Merci, ça marche nickel maintenant.


---------------
By bob.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Résolu - Soucis avec boost::bind

 

Sujets relatifs
[Résolu sans trop savoir comment] Ma page s'affiche très bas[Resolu][PHP]Fonction xAjax pas appelée ?
Problème de clé étrangère [RESOLU][résolu] parcours d'un char** sans connaitre le nombre de chaines
Désactiver automatiquement des checkbox si on en coche 1 autre[RESOLU]Syntaxe étrange en C++ avec GCC (résolu)
[Résolu] Plusieurs argument dans une url fonction js ajax[Resolu]API MYSQL erreur compilation
Error Javascript:"Object Required"- 5 lignes de code [RESOLU][résolu]Problème de vérification d'un entier
Plus de sujets relatifs à : Résolu - Soucis avec boost::bind


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR