выдает ошибку в функции find_first_of с двоичным предикатом

Вот код

#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 *) и как преобразовать в него мою функцию предиката.

0

Решение

Ваш предикат не может быть нестатической функцией-членом, поскольку он принимает неявный первый параметр, давая всего три параметра. Вам нужна либо статическая функция-член, либо не-член:

// 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 функция).

2

Другие решения

__thiscall это соглашение о вызовах, которое используется для нестатическая функция-член только MSVC ++.

В вашем коде pred это нестатическая функция-член, которая не может использоваться в качестве двоичного предиката без некоторого обходного пути, такого как std::bind, Я бы скорее предложил вам сделать эту функцию static, Или даже лучше использовать лямда (Только C ++ 11).

1

Ваш предикат нестатическая функция-член. Либо сделайте его статическим (или просто не-функцией), либо используйте 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, так как это вероятно не должен изменить состояние объекта, на который он вызывается.

0
По вопросам рекламы [email protected]