繁体   English   中英

使用boost :: lambda :: bind有什么不对?

[英]What's wrong of this use of boost::lambda::bind?

我正在尝试使用boost::lambda::bind()来定义我传递给find_if中的find_if算法的谓词。 具体来说,我想搜索结构向量以找到特定成员具有指定值的第一个条目。 我的例子如下:

#include <boost/lambda/bind.hpp>
#include <boost/range/algorithm/find_if.hpp>
#include <vector>

using namespace std;
using namespace boost;
using namespace boost::lambda;

struct foo
{
    string s;
    int x;
};

int main()
{
    // create list and add a couple entries
    vector<foo> fooList;
    foo f1 = {"abc", 1};
    foo f2 = {"def", 2};
    fooList.push_back(f1);
    fooList.push_back(f2);
    // search for a value with the desired member
    //     fails with a compile error!
    range_iterator<vector<foo> > it = find_if(fooList, boost::lambda::bind(&foo::s, _1) == string("abc"));
    return 0;
}

当我尝试编译它时(在gcc 4.7.2下),我得到了典型的模板实例化错误,表明没有找到与bind()const char []返回的类型兼容的operator== 我也用其他类型尝试了这个,比如int ,结果相同。

我必须遗漏一些bind()用法的细节,但我看不到它; 似乎这种事情应该基于文档工作。 我错了吗?

编辑:这是编译器输出的第一部分:

test.cc:24:92: error: no match for ‘operator==’ in ‘boost::lambda::bind(const Arg1&, const Arg2&) [with Arg1 = std::basic_string<char> foo::*; Arg2 = boost::lambda::lambda_functor<boost::lambda::placeholder<1> >; typename boost::lambda::detail::bind_tuple_mapper<const Arg1, const Arg2>::type = boost::tuples::tuple<std::basic_string<char> foo::* const, const boost::lambda::lambda_functor<boost::lambda::placeholder<1> >, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type>]((* & boost::lambda::{anonymous}::_1)) == "abc"’

事实证明我没有包括所需的标题。 似乎<boost/lambda/bind.hpp><boost/lambda/bind.hpp> bind功能,并且不包括结果类型的运算符重载。 如果我将#include <boost/lambda/lambda.hpp>到上面,那么它解决了我引用的编译器错误。 最终修订的代码(修复find_if()返回值类型中的另一个错误)如下:

#include <boost/lambda/bind.hpp>
#include <boost/lambda/lambda.hpp>
#include <boost/range/algorithm/find_if.hpp>
#include <string>
#include <vector>

using namespace std;
using namespace boost;
using namespace boost::lambda;

struct foo
{
    string s;
    int x;
};

int main()
{
    // create list and add a couple entries
    vector<foo> fooList;
    foo f1 = {"abc", 1};
    foo f2 = {"def", 2};
    fooList.push_back(f1);
    fooList.push_back(f2);
    // search for a value with the desired member
    typename range_iterator<vector<foo> >::type it = find_if(fooList, bind(&foo::s, _1) == "abc");
    return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM