2010-05-08 6 views
1

J'essaie de compiler l'extrait de code ci-dessous. Mais il échoue avec:boost :: les expressions de lambda bind ne peuvent pas être liées à la chaîne vide() de la chaîne de caractères

erreur C2665: 'boost :: lambda :: function_adaptor :: apply': aucune des 8 surcharges ne peut convertir tous les types d'argument. La spécification du type de retour lors de l'appel de bind n'aide pas.

Une idée de ce que je fais mal?

#include <boost/lambda/lambda.hpp> 
#include <boost/lambda/bind.hpp> 
#include <string> 
#include <map> 

int main() 
{ 

    namespace bl = boost::lambda; 
    typedef std::map<int, std::string> types; 
    types keys_and_values; 
    keys_and_values[ 0 ] = "zero"; 
    keys_and_values[ 1 ] = "one"; 
    keys_and_values[ 2 ] = "Two"; 

    std::for_each(
     keys_and_values.begin(), 
     keys_and_values.end(), 
     std::cout << bl::constant("Value empty?: ") << std::boolalpha << 
         bl::bind(&std::string::empty, 
           bl::bind(&types::value_type::second, _1)) << "\n"); 




    return 0; 
} 

Répondre

2

modifications mineures pour en faire la compilation avec g ++ (temps meilleur compilateur :-)?)

1 #include <boost/lambda/lambda.hpp> 
2 #include <boost/lambda/bind.hpp> 
3 #include <algorithm> 
4 #include <iostream> 
5 #include <string> 
6 #include <map> 
7 
8 int main() 
9 { 
10 
11  namespace bl = boost::lambda; 
12  typedef std::map<int, std::string> types; 
13  types keys_and_values; 
14  keys_and_values[ 0 ] = "zero"; 
15  keys_and_values[ 1 ] = "one"; 
16  keys_and_values[ 2 ] = "Two"; 
17 
18  std::for_each(
19     keys_and_values.begin(), 
20     keys_and_values.end(), 
21     std::cout << bl::constant("Value empty?: ") << std::boolalpha << 
22     bl::bind(&std::string::empty, 
23       bl::bind(&types::value_type::second, bl::_1)) << "\n"); 
24 
25 
26 
27 
28  return 0; 
29 } 

manquant de préavis comprend et bl::_1

+0

ahhh merci. J'ai découvert que boot/bind.hpp était inclus dans mon projet. Une fois que j'ai enlevé l'inclure, ça a bien fonctionné. Je ne sais pas pourquoi cela ne m'a pas donné une erreur plus descriptive. – navigator

+0

@navigator oui, je suis tombé dessus moi-même. boost bind met _1 dans un espace de nom anonyme qui provoque toutes sortes de confusion avec lambda – Anycorn

1
#include <boost/foreach.hpp> 
... 
#define foreach BOOST_FOREACH 
... 
foreach(types::value_type kv, keys_and_values) 
    std::cout << "Value empty?: " << std::boolalpha 
      << kv.second.empty() << "\n"; 
... 
+0

Une approche largement supérieure à essayer de tromper 'std :: for_each' pour faire autre chose que trivial! Les boucles basées sur la plage sont également présentes en C++ 0x. – UncleBens

+0

J'utilise for_each dans cet exemple juste pour en savoir plus sur les capacités de liaison boost :: lambda. – navigator

+0

@navigator: Ok alors. Je pense toujours que boost.lambda sera également rendu obsolète par C++ 0x. – UncleBens