boost::mem_fn & std::mem_fun_ref
От: ssi Россия  
Дата: 15.01.04 19:55
Оценка:
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 необходимо использовать другой синтаксис вызова?
Знающие не говорят, говорящие не знают. Лао Цзы
Re: boost::mem_fn & std::mem_fun_ref
От: MaximE Великобритания  
Дата: 15.01.04 21:32
Оценка:
ssi wrote:

>
> 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 необходимо использовать другой синтаксис вызова?

Это не бага.

У тебя перенруженая ф-ция. boost::mem_fn() — это тоже перегруженая ф-ция. Так как boost::mem_fn() может быть вызван с любым из foo(), компилятор не может решить это за тебя. Нужно ему помочь:

boost::mem_fn(static_cast<SomeClass&(*)()>(&SomeClass::foo)));


С std::mem_fun_ref() история несколько другая. В STL которая от шестерки, mem_fun_ref() принимает только указатель на ф-цию член без аргумента, поэтому выбирается foo(). C STL от семерки или STLPort такой трюк не пройдет и будет та же самая ошибка, что и с boost::mem_fn().

--
Maxim Egorushkin
MetaCommunications Engineering
http://www.meta-comm.com/engineering/
Posted via RSDN NNTP Server 1.8 beta
Re[2]: boost::mem_fn & std::mem_fun_ref
От: MaximE Великобритания  
Дата: 15.01.04 21:33
Оценка: 5 (2)
MaximE wrote:

>
> boost::mem_fn(static_cast<SomeClass&(*)()>(&SomeClass::foo)));
>


ошибка, надо так:

boost::mem_fn(static_cast<SomeClass&(SomeClass::*)()>(&SomeClass::foo)));


--
Maxim Egorushkin
MetaCommunications Engineering
http://www.meta-comm.com/engineering/
Posted via RSDN NNTP Server 1.8 beta
Re[3]: boost::mem_fn & std::mem_fun_ref
От: ssi Россия  
Дата: 16.01.04 19:28
Оценка:
Здравствуйте, 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?

После такой записи
ME>boost::mem_fn(static_cast<SomeClass&(SomeClass::*)()>(&SomeClass::foo)));

хочется использовать mem_fun_ref, не смотря на его ограниченное применение.
Знающие не говорят, говорящие не знают. Лао Цзы
Re: boost::mem_fn & std::mem_fun_ref
От: Юнусов Булат Россия  
Дата: 16.01.04 23:29
Оценка: 1 (1) +1
Здравствуйте, ssi, Вы писали:

ssi>Это бага boost::mem_fn или в таких случаях для boost::mem_fn необходимо использовать другой синтаксис вызова?


vc6 можно успокоить параметризовав явно
    std::for_each(ssc.begin(), ssc.end(), 
        boost::mem_fn<SomeClass&, SomeClass>(&SomeClass::foo)
    );



А vc7.1 и gcc3.3 можно обхитрить просто объявив пустышку
struct SomeClass
{
    SomeClass& foo(int);
    SomeClass& foo();
    SomeClass& foo(struct STUB &);
};

Тогда можно будет писать:
    std::for_each(ssc.begin(), ssc.end(), 
        boost::mem_fn(&SomeClass::foo)
    );
Re[2]: boost::mem_fn & std::mem_fun_ref
От: ssi Россия  
Дата: 17.01.04 11:46
Оценка:
Здравствуйте, Юнусов Булат, Вы писали:

ЮБ>Здравствуйте, ssi, Вы писали:


ssi>>Это бага boost::mem_fn или в таких случаях для boost::mem_fn необходимо использовать другой синтаксис вызова?


ЮБ>vc6 можно успокоить параметризовав явно

ЮБ>
ЮБ>    std::for_each(ssc.begin(), ssc.end(), 
ЮБ>        boost::mem_fn<SomeClass&, SomeClass>(&SomeClass::foo)
ЮБ>    );
ЮБ>



ЮБ>А vc7.1 и gcc3.3 можно обхитрить просто объявив пустышку

ЮБ>
ЮБ>struct SomeClass
ЮБ>{
ЮБ>    SomeClass& foo(int);
ЮБ>    SomeClass& foo();
ЮБ>    SomeClass& foo(struct STUB &);
ЮБ>};
ЮБ>

ЮБ>Тогда можно будет писать:
ЮБ>
ЮБ>    std::for_each(ssc.begin(), ssc.end(), 
ЮБ>        boost::mem_fn(&SomeClass::foo)
ЮБ>    );
ЮБ>


Первый вариант у меня не прозодит.
Насчет второго: ради такой ерунды вводить избыточность в свой код не хочется, ИМХО лучьше использовать стандартную mem_fun_ref.
Знающие не говорят, говорящие не знают. Лао Цзы
Re[3]: boost::mem_fn & std::mem_fun_ref
От: Юнусов Булат Россия  
Дата: 17.01.04 12:49
Оценка:
Здравствуйте, ssi, Вы писали:

ssi>Первый вариант у меня не прозодит.

Он только для vc6 прокатит.

ssi>Насчет второго: ради такой ерунды вводить избыточность в свой код не хочется, ИМХО лучьше использовать стандартную mem_fun_ref.

Дело хозяйское.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.