这是代码
#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 *)以及如何将谓词函数转换为它。
答案 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
,因为它可能不应该改变它被调用的对象的状态。