使用二元谓词在find_first_of函数上给出错误

时间:2013-06-11 15:59:45

标签: c++ stl predicate

这是代码

#include <string>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

class test {
    struct con {
        string s1;
        string s2;
    };
public:
    void somefunc();

private:
    bool pred(con c1, con c2);
    vector<con> vec;
};

void test::somefunc()
{
    vector<con> v;
    vector<con>::iterator it = find_first_of(vec.begin(), vec.end(), v.begin(), v.end(), pred);
}

bool test::pred(con c1, con c2)
{
    return 0;
}

它给出了错误

\ test.cpp(24):错误C2664:'struct test :: con * __ cdecl std :: find_first_of(struct test :: con *,struct test :: con *,struct test :: con *,struct test: :con *,bool(__ thiscall *)(struct test :: con,str uct test :: con))':不能将参数5从'bool(struct test :: con,struct test :: con)'转换为'bool(__thiscall *)(struct test :: con,struct test :: con) “         范围内具有此名称的函数都不匹配目标类型

我不明白是什么(__thiscall *)以及如何将谓词函数转换为它。

3 个答案:

答案 0 :(得分:2)

您的谓词不能是非静态成员函数,因为它采用隐式第一个参数,总共提供三个参数。您需要静态成员函数或非成员函数:

// non-member function
bool pred(const con& c1, const con& c2)
{
    return false;
}

void test::somefunc()
{
  vector<con> v;
  vector<con>::iterator it = find_first_of(vec.begin(), vec.end(), 
                                           v.begin(), v.end(), 
                                           pred);
}

或者,使用std::bind绑定this作为第一个参数:

using namespace std::placeholders;
vector<con>::iterator it = find_first_of(vec.begin(), vec.end(), 
                                         v.begin(), v.end(),
                                         std::bind(&test::pred, this, _1, _2));

std::bind的调用会产生一个带有两个con参数的可调用实体。它会在内部存储this指针的副本(但this功能中未使用pred

答案 1 :(得分:1)

__thiscall是一种调用约定,仅用于MSVC ++的非静态成员函数。

在您的代码中,pred非静态成员函数,如果没有std::bind之类的解决方法,则不能将其用作二元谓词。我宁愿建议你做这个功能static。或者甚至更好地使用lamda(仅限C ++ 11)。

答案 2 :(得分:0)

您的谓词是非静态成员函数。要么使它成为静态(或只是非成员函数),要么使用std::bind()(如果你买不起C ++ 11,则使用等效的Boost.Bind):

#include <functional>

// ...

vector<con>::iterator it = find_first_of(
    vec.begin(), vec.end(), v.begin(), v.end(),
    std::bind(&test::pred, this, std::placeholders::_1, std::placeholders::_2));

这是live example

如果您选择将您的功能保留为会员功能并使用std::bind(),请考虑将您的功能pred()限定为const,因为它可能应该改变它被调用的对象的状态。