struct SomeClass
{
SomeClass& foo(int);
SomeClass& foo();
}
...
some_std_container<SomeClass> ssc;
std::for_each(ssc.begin(), ssc.end(), boost::mem_fn(&SomeClass::foo)); // выдает error при компиляции
std::for_each(ssc.begin(), ssc.end(), std::mem_fun_ref(&SomeClass::foo)); // все ОК, вызывает foo()
error: more than one instance of overloaded function "boost::mem_fn" matches the argument list:
function template"boost::mem_fn(R (T::*)())"
function template"boost::mem_fn(R (T::*)(A1))"
argument types are: (<unknown-type>)
std::for_each(ssc.begin(), ssc.end(), boost::mem_fn(&SomeClass::foo));
^
Это бага boost::mem_fn или в таких случаях для boost::mem_fn необходимо использовать другой синтаксис вызова?
> error: more than one instance of overloaded function "boost::mem_fn" matches the argument list:
> function template"boost::mem_fn(R (T::*)())"
> function template"boost::mem_fn(R (T::*)(A1))"
> argument types are: (<unknown-type>)
> std::for_each(ssc.begin(), ssc.end(), boost::mem_fn(&SomeClass::foo));
> ^
>
> > Это бага boost::mem_fn или в таких случаях для boost::mem_fn необходимо использовать другой синтаксис вызова?
Это не бага.
У тебя перенруженая ф-ция. boost::mem_fn() — это тоже перегруженая ф-ция. Так как boost::mem_fn() может быть вызван с любым из foo(), компилятор не может решить это за тебя. Нужно ему помочь:
С std::mem_fun_ref() история несколько другая. В STL которая от шестерки, mem_fun_ref() принимает только указатель на ф-цию член без аргумента, поэтому выбирается foo(). C STL от семерки или STLPort такой трюк не пройдет и будет та же самая ошибка, что и с boost::mem_fn().
Здравствуйте, MaximE.
ME>У тебя перенруженая ф-ция. boost::mem_fn() — это тоже перегруженая ф-ция. Так как boost::mem_fn() может быть вызван с любым из foo(), компилятор не может решить это за тебя. Нужно ему помочь:
Спасибо. Странно, что разработчики boost::mem_fn не предусмотрели такой ситуации и не сделали своего обходного решения.
ME>В STL которая от шестерки, mem_fun_ref() принимает только указатель на ф-цию член без аргумента, поэтому выбирается foo().
Почему Peter Dimov and Multi Media Ltd отказался от такого подхода к реализации своей mem_fn?
Здравствуйте, Юнусов Булат, Вы писали:
ЮБ>Здравствуйте, ssi, Вы писали:
ssi>>Это бага boost::mem_fn или в таких случаях для boost::mem_fn необходимо использовать другой синтаксис вызова?
ЮБ>vc6 можно успокоить параметризовав явно ЮБ>
Первый вариант у меня не прозодит.
Насчет второго: ради такой ерунды вводить избыточность в свой код не хочется, ИМХО лучьше использовать стандартную mem_fun_ref.
Здравствуйте, ssi, Вы писали:
ssi>Первый вариант у меня не прозодит.
Он только для vc6 прокатит.
ssi>Насчет второго: ради такой ерунды вводить избыточность в свой код не хочется, ИМХО лучьше использовать стандартную mem_fun_ref.
Дело хозяйское.