0

这是代码

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

它给出了错误

est.cpp(24) : error 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*) 以及如何将我的谓词函数转换为它。

4

3 回答 3

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::bindto bindthis作为第一个参数:

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函数中使用)。

于 2013-06-11T16:03:26.440 回答
1

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

在您的代码中,pred是一个非静态成员函数,如果没有一些解决方法(例如std::bind. 我宁愿建议你做这个功能static。或者甚至更好地使用lamda(仅限 C++11)。

于 2013-06-11T16:01:35.447 回答
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));

这是一个活生生的例子

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

于 2013-06-11T16:04:33.020 回答