Я пытаюсь использовать частичное применение аргументов функции, чтобы я мог использовать STL find_if
.Вот пример программы: (Заголовок класса и реализация объединены для краткости.)
#include <functional>
#include <iostream>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
struct Odp
{
int id;
Odp(int id)
{
this->id = id;
}
~Odp()
{
cout << "Destructing Odp " << id << endl;
}
};
typedef vector<Odp*> OdpVec;
class Foo
{
public:
void loadUp()
{
vec.push_back(new Odp(0));
vec.push_back(new Odp(1));
vec.push_back(new Odp(2));
}
void printWithID(int id)
{
OdpVec::iterator iter = find_if(vec.begin(), vec.end(), bind1st(&hasID, id));
if (iter != vec.end())
{
cout << "Odp at " << *iter << " has id " << id << endl;
return;
}
cout << "No Odp with id " << id << " could be found." << endl;
}
private:
OdpVec vec;
bool hasID(int id, Odp* odp)
{
return odp->id == id;
}
};
int main()
{
Foo foo;
foo.loadUp();
foo.printWithID(1);
}
Однако, это даже не компилируется.Ошибка:
error C2276: '&' : illegal operation on bound member function expression
Что я здесь не так делаю?
ОБНОВЛЕНИЕ Создание hasID()
свободной плавающей функции приводит к этой ошибке:
error C2664: 'std::find_if' : cannot convert parameter 3 from 'std::binder1st<_Fn2>' to 'std::binder1st<_Fn2>'
1> with
1> [
1> _Fn2=bool (__cdecl *)(int,Odp &)
1> ]
1> Cannot copy construct class 'std::binder1st<_Fn2>' due to ambiguous copy constructors or no available copy constructor
1> with
1> [
1> _Fn2=bool (__cdecl *)(int,Odp &)
1> ]