есть обычная структура: struct sS { bool is(void) { return false; } }; и код: std::vector<const sS*>::iterator i; i = std::find_if(i, i, boost::bind(sS::is, _1)); выдает ошибку компиляции - ругается на const в векторе: f:\Boost\include\boost-1_33_1\boost\bind\mem_fn_template.hpp(36): error C2440: 'argument' : cannot convert from 'const sS *' to 'sS *const ' Компилятор от VS2003. Плиз Хелп!
systemio Код (Text): struct sS { bool is(void) const{ return false; } }; int main(int argc, char **argv) { std::vector<const sS*>::iterator i; i = std::find_if(i, i, boost::bind(&sS::is, _1)); return 0; } компилер g++
struct sS { bool is(void) { return false; } const bool is(void) const { return false; } }; Да! У метода is забыл вконце const. Но опять не компилится если сделать два одинаковых метода (не смотрите что глупые методы - они повторяют аналогию методов begin для итераторов).
Отбой! Нашел! typedef const bool (sS::*pMF)(void) const; pMF p = sS::is; i = std::find_if(i, i, boost::bind(p, _1));
systemio, вот тебе три формы - boost headers сами определяют тип: Код (Text): std::vector<Something> v; std::vector<Something>::iterator i = std::find_if(v.begin(), v.end(), boost::bind(&Something::is, _1)); std::vector<Something *> vp; std::vector<Something *>::iterator j = std::find_if(vp.begin(), vp.end(), boost::bind(&Something::is, _1)); std::vector<const Something *> vpc; std::vector<const Something *>::iterator k = std::find_if(vpc.begin(), vpc.end(), boost::bind(&Something::is, _1)); ессно, для "bool is() const {return false;}" кста, для references есть boost:ref(_1) и boost::cref(_1)
при наличии структуры вида: struct sS { bool is(void) { return false; } const bool is(void) const { return false; } }; ни одна из записей не работает: boost::bind(&sS::is, boost::cref(_1)) boost::bind(&sS::is, boost::ref(_1)) Я думаю он не может распарсить и ему приходится вручную указывать верный вариант. Непонятно!!! Это конечно огорчает - кажется это единственный выход в такой ситуации.
systemio, что-то ты путаешь. Выше я привёл рабочий код для разных контейнеров - скомпилено в VS2008. Твой случай - последний. Про boost::ref() - во-первых это не твой случай т.к. у тебя указатели. А во-вторых, я чуть приврал - это надо что бы послать аргумент типа reference в сгенерированный functor: Код (Text): void CalcThread::NotifyOnFinish(bool valid, const Result &r, const base::String &output) { std::for_each(m_ovservers_.begin(), m_ovservers.end(), boost::bind(&StatusHandler::OnFinish, _1, valid, boost::ref(r), boost::ref(output))); }
std::find_if(i, i, boost::bind(&sS::is, _1)) - вот эта штука не компилится потому что компилятор (у меня ВС 2003) не может определить какую из двух is выбрать. Вернее он выбирает не константный метод и у него не стыкуется с константным объектом. поэтому приходися вручную делать указатель на константный метод и подсовывать в bind. Такие дела!
так оставь только константную версию метода. Не-конст через "const указатель" компилер ессно не даст вызвать. Не понимаю в чём проблема. Кста, убери тот "const" что вначале - для bool это бессмысленно.