2010-05-08 27 views
1

我想獲得下面的代碼片段進行編譯。但它失敗:boost :: lambda綁定表達式不能綁定到字符串的空()來工作

錯誤C2665:'boost :: lambda :: function_adaptor :: apply':8個重載都不能轉換所有的參數類型。在調用綁定時指定返回類型無濟於事。

任何想法我做錯了什麼?

#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; 
} 

回答

2

小的改動,使其與G ++編譯(時間更好的編譯器:-)?)

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 } 

通知缺失包括和bl::_1

+0

唉唉感謝。發現boot/bind.hpp包含在我的項目中。一旦我刪除了包含,它運行良好。不知道爲什麼它沒有給我一個更具描述性的錯誤。 – navigator 2010-05-08 17:08:09

+0

@navigator是的,我自己遇到了。 boost bind將_1放在匿名命名空間中,這會導致與lambda的所有混淆。 – Anycorn 2010-05-08 17:10:06

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

一個非常優越的方法來欺騙'std :: for_each'來做任何超出平凡的事情! C++ 0x中也有基於範圍的循環。 – UncleBens 2010-05-08 18:00:56

+0

爲了學習boost :: lambda綁定功能,我在這個例子中使用了for_each。 – navigator 2010-05-08 18:36:36

+0

@navigator:好的。我仍然認爲boost.lambda也會被C++ 0x廢棄。 – UncleBens 2010-05-08 19:42:23