【问题标题】:boost::lambda bind expressions can't get bind to string's empty() to workboost::lambda 绑定表达式无法绑定到字符串的 empty() 工作
【发布时间】:2010-05-08 16:42:51
【问题描述】:

我正在尝试编译下面的代码 sn-p。但它失败了:

error C2665: 'boost::lambda::function_adaptor::apply' : 8 个重载中没有一个可以转换所有参数类型。在调用 bind 时指定返回类型没有帮助。

知道我做错了什么吗?

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

【问题讨论】:

    标签: c++ boost-lambda


    【解决方案1】:

    小改动使它可以用 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

    【讨论】:

    • 啊谢谢。发现 boot/bind.hpp 已包含在我的项目中。一旦我删除了包含,它工作正常。不知道为什么它没有给我一个更具描述性的错误。
    • @navigator 是的,我自己也遇到过。 boost bind 将 _1 放在匿名命名空间中,这会导致与 lambda 的各种混淆
    【解决方案2】:
    #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";
    ...
    

    【讨论】:

    • 一种非常优秀的方法来试图欺骗std::for_each 做任何微不足道的事情!基于范围的 for 循环也存在于 C++0x 中。
    • 我在这个例子中使用 for_each 只是为了了解 boost::lambda 绑定功能。
    • @navigator:那好吧。我仍然认为 boost.lambda 也会被 C++0x 淘汰。
    • @UncleBens 我想我读到 phoenix3 将取代 boost.lambda。它仍然占有一席之地,因为 c++0x lambda 只是单态的。 Phoenix3 和 boost.lambda 是完全多态的。所以你可以通过_1 &lt;&lt; 2 并拥有一个完全通用的移位表达式。
    猜你喜欢
    • 2015-10-30
    • 2019-06-21
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    相关资源
    最近更新 更多