Вот код
#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): ошибка 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 *) и как преобразовать в него мою функцию предиката.
Ваш предикат не может быть нестатической функцией-членом, поскольку он принимает неявный первый параметр, давая всего три параметра. Вам нужна либо статическая функция-член, либо не-член:
// 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
функция).
__thiscall
это соглашение о вызовах, которое используется для нестатическая функция-член только MSVC ++.
В вашем коде pred
это нестатическая функция-член, которая не может использоваться в качестве двоичного предиката без некоторого обходного пути, такого как std::bind
, Я бы скорее предложил вам сделать эту функцию static
, Или даже лучше использовать лямда (Только C ++ 11).
Ваш предикат нестатическая функция-член. Либо сделайте его статическим (или просто не-функцией), либо используйте std::bind()
(или эквивалентный Boost.Bind, если вы не можете позволить себе C ++ 11):
#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
, так как это вероятно не должен изменить состояние объекта, на который он вызывается.