Основная проблема, кроме вызовов bind
(Адам Митц был прав в этой части), заключается в том, что std::set<std::string>::find
- перегруженная функция, поэтому вы не можете указать ее непосредственно в вызове bind
. Вам нужно указать компилятору какой find
использовать, например, так:
using namespace boost::lambda;
typedef std::vector<std::string> T1;
typedef std::set<std::string> T2;
T1 strings = getstrings();
T2 others = getothers();
T2::const_iterator (T2::*findFn)(const std::string&) const=&T2::find;
T2::const_iterator othersEnd=others.end();
strings.erase(std::remove_if(strings.begin(), strings.end(),
(bind(&std::string::length, _1) < 24
&& bind(findFn, boost::ref(others), _1) == othersEnd)),
strings.end());
Это компилируется, но не работает должным образом, по причинам, которые я еще не выяснил ... функция find
никогда не возвращает others.end()
, поэтому она никогда ничего не удаляет. Все еще работаю над этой частью.
EDIT: исправление, функция find
равна , возвращая others.end()
, но сравнение не распознает ее. Я не знаю почему.
ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ: Благодаря комментарию Адама, я вижу, что идет не так, и исправил проблему. Теперь он работает как задумано.
(Посмотрите историю изменений, если хотите увидеть мою полную тестовую программу.)