Résolu - Soucis avec boost::bind

Résolu - Soucis avec boost::bind - C++ - Programmation

Marsh Posté le 12-06-2009 à 10:54:15    

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.
Reply

Marsh Posté le 12-06-2009 à 10:54:15   

Reply

Marsh Posté le 12-06-2009 à 12:01:30    

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

Reply

Marsh Posté le 12-06-2009 à 15:59:21    

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.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed