boost::bind не вижу коряги
От: carpenter СССР  
Дата: 18.03.09 11:01
Оценка:
пытаюсь биндить так —

std::for_each(out_md.begin(),out_md.end(),boost::bind(&UMC::VideoData::Init,_1,
           pvd.info.clip_info.width,pvd.info.clip_info.height,(UMC::ColorFormat)cf,(Ipp32s)0);

получаю —


1>.\Decode.cpp(45) : error C2780: 'boost::_bi::bind_t<R,boost::_mfi::cmf8<R,T,A1,A2,A3,A4,A5,A6,A7,A8>,_bi::list_av_9<A1,A2,A3,A4,A5,A6,A7,A8,A9>::type> boost::bind(R (__thiscall T::* )(B1,B2,B3,B4,B5,B6,B7,B8) const,A1,A2,A3,A4,A5,A6,A7,A8,A9)' : expects 10 arguments - 6 provided
1>        D:\boost_1_35_0\boost_1_35_0\boost/bind/bind_mf_cc.hpp(222) : see declaration of 'boost::bind'
1>.\Decode.cpp(45) : error C2780: 'boost::_bi::bind_t<R,boost::_mfi::mf8<R,T,A1,A2,A3,A4,A5,A6,A7,A8>,_bi::list_av_9<A1,A2,A3,A4,A5,A6,A7,A8,A9>::type> boost::bind(R (__thiscall T::* )(B1,B2,B3,B4,B5,B6,B7,B8),A1,A2,A3,A4,A5,A6,A7,A8,A9)' : expects 10 arguments - 6 provided
1>        D:\boost_1_35_0\boost_1_35_0\boost/bind/bind_mf_cc.hpp(211) : see declaration of 'boost::bind'
1>.\Decode.cpp(45) : error C2780: 'boost::_bi::bind_t<R,boost::_mfi::cmf7<R,T,A1,A2,A3,A4,A5,A6,A7>,_bi::list_av_8<A1,A2,A3,A4,A5,A6,A7,A8>::type> boost::bind(R (__thiscall T::* )(B1,B2,B3,B4,B5,B6,B7) const,A1,A2,A3,A4,A5,A6,A7,A8)' : expects 9 arguments - 6 provided
1>        D:\boost_1_35_0\boost_1_35_0\boost/bind/bind_mf_cc.hpp(198) : see declaration of 'boost::bind'

..... далее в том же духе


определения функций —


  // Initialize. Only remembers image characteristics for future.
    virtual
    Status Init(Ipp32s iWidth,
                Ipp32s iHeight,
                ColorFormat cFormat,
                Ipp32s iBitDepth = 0);

    // Initialize. Only remembers image characteristics for future.
    // Should be followed by SetColorFormat
    virtual
    Status Init(Ipp32s iWidth,
                Ipp32s iHeight,
                Ipp32s iPlanes,
                Ipp32s iBitDepth = 8);


че хотит непонятно же вроде типы указаны явно и буст вроде как виртуальные тоже биндит
Re: boost::bind не вижу коряги
От: carpenter СССР  
Дата: 18.03.09 11:06
Оценка:
Здравствуйте, carpenter, Вы писали:



C>пытаюсь биндить так -


C>
C>std::for_each(out_md.begin(),out_md.end(),boost::bind(&UMC::VideoData::Init,_1,
C>           pvd.info.clip_info.width,pvd.info.clip_info.height,(UMC::ColorFormat)cf,(Ipp32s)0); 
C>


Да ... и — ColorFormat — enum
Re: boost::bind не вижу коряги
От: jazzer Россия Skype: enerjazzer
Дата: 18.03.09 11:08
Оценка:
Здравствуйте, carpenter, Вы писали:

у меня такое собралось:
#include <vector>
#include <boost/bind.hpp>
struct A{
    virtual
    int Init(int iWidth,
                int iHeight,
                int cFormat,
                int iBitDepth = 0);
};

void f()
{
  std::vector<A> a;
  std::for_each(a.begin(), a.end(), boost::bind(&A::Init, _1, 1,2,3,4) );
}


Так что ищи ошибку у себя.
Как вариант — у тебя контейнер не константный, случаем?
Покажи, как он объявлен.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: boost::bind не вижу коряги
От: denisko http://sdeniskos.blogspot.com/
Дата: 18.03.09 11:11
Оценка:
Здравствуйте, carpenter, Вы писали:
....
pvd.info.clip_info.width,pvd.info.clip_info.height
точно Ipp32s?
<Подпись удалена модератором>
Re[2]: boost::bind не вижу коряги
От: carpenter СССР  
Дата: 18.03.09 11:13
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, carpenter, Вы писали:




J>Так что ищи ошибку у себя.

J>Как вариант — у тебя контейнер не константный, случаем?
J>Покажи, как он объявлен.

да ничего концептуального —


std::vector<UMC::VideoData  > out_md;


есть ощущение что он не может выбрать между двумя функциями 0 а вот как ему помочь — не знаю
Re: boost::bind не вижу коряги
От: Аноним  
Дата: 18.03.09 11:14
Оценка: 2 (1) +2
Здравствуйте, carpenter, Вы писали:

C>пытаюсь биндить так -


C>
C>std::for_each(out_md.begin(),out_md.end(),boost::bind(&UMC::VideoData::Init,_1,
C>           pvd.info.clip_info.width,pvd.info.clip_info.height,(UMC::ColorFormat)cf,(Ipp32s)0); 
C>


из адреса функции нельзя понять какую именно функцию следует биндить:

std::for_each(out_md.begin(),out_md.end(),boost::bind(
    static_cast<UMC::VideoData::Status (UMC::VideoData::*)(Ipp32s, Ipp32s, ColorFormat ,Ipp32s)>(&UMC::VideoData::Init)
    ,_1, pvd.info.clip_info.width,pvd.info.clip_info.height,cf,0);


не уверен что правильно записал формат функции, но идея думаю понятна.
Re[2]: boost::bind не вижу коряги
От: carpenter СССР  
Дата: 18.03.09 11:16
Оценка:
Здравствуйте, denisko, Вы писали:

D>Здравствуйте, carpenter, Вы писали:

D>....
D> pvd.info.clip_info.width,pvd.info.clip_info.height
D>точно Ipp32s?


typedef struct sClipInfo
    {
        Ipp32s width;                                           // (Ipp32s) width of media
        Ipp32s height;                                          // (Ipp32s) height of media

    } ClipInfo;


Re[3]: boost::bind не вижу коряги
От: denisko http://sdeniskos.blogspot.com/
Дата: 18.03.09 11:19
Оценка: 2 (1)
Здравствуйте, carpenter, Вы писали:

C>Здравствуйте, denisko, Вы писали:


D>>Здравствуйте, carpenter, Вы писали:

D>>....
D>> pvd.info.clip_info.width,pvd.info.clip_info.height
D>>точно Ipp32s?


C>
C>typedef struct sClipInfo
C>    {
C>        Ipp32s width;                                           // (Ipp32s) width of media
C>        Ipp32s height;                                          // (Ipp32s) height of media

C>    } ClipInfo;

C>


C>

Тогда скорее всего надо явно приводить Init к указтелю Status (Ipp32s,Ipp32s, ColorFormat, Ipp32s)
<Подпись удалена модератором>
Re[2]: boost::bind не вижу коряги
От: carpenter СССР  
Дата: 18.03.09 11:25
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, carpenter, Вы писали:


C>>пытаюсь биндить так -


C>>
C>>std::for_each(out_md.begin(),out_md.end(),boost::bind(&UMC::VideoData::Init,_1,
C>>           pvd.info.clip_info.width,pvd.info.clip_info.height,(UMC::ColorFormat)cf,(Ipp32s)0); 
C>>


А>из адреса функции нельзя понять какую именно функцию следует биндить:


А>
А>std::for_each(out_md.begin(),out_md.end(),boost::bind(
А>    static_cast<UMC::VideoData::Status (UMC::VideoData::*)(Ipp32s, Ipp32s, ColorFormat ,Ipp32s)>(&UMC::VideoData::Init)
А>    ,_1, pvd.info.clip_info.width,pvd.info.clip_info.height,cf,0); 
А>


Отлично — собралось ... я подозревал , догадывался , думал что догадается если в параметре приведение указать
... но чтобы так
Re[3]: boost::bind не вижу коряги
От: carpenter СССР  
Дата: 18.03.09 11:34
Оценка:
Здравствуйте, carpenter, Вы писали:


C>Отлично — собралось ... я подозревал , догадывался , думал что догадается если в параметре приведение указать

C>... но чтобы так

хммм — тогда вопрос — почему простой вызов функции различает разницу(проверил) между функциям а бинд нет?
вопрос чисто академический
Re[4]: boost::bind не вижу коряги
От: Аноним  
Дата: 18.03.09 12:17
Оценка: 1 (1) +1
Здравствуйте, carpenter, Вы писали:

C>хммм — тогда вопрос — почему простой вызов функции различает разницу(проверил) между функциям а бинд нет?

C>вопрос чисто академический

bind не должен ничего различать, тут компилятор не смог выбрать какую именно из функций надо передать bind в качестве аргумента, т.к. он не знает что для этого надо проверить остальные параметры bind.
Re[3]: boost::bind не вижу коряги
От: jazzer Россия Skype: enerjazzer
Дата: 18.03.09 23:35
Оценка:
Здравствуйте, carpenter, Вы писали:

C>есть ощущение что он не может выбрать между двумя функциями 0 а вот как ему помочь — не знаю

А, у тебя там функция перегруженная!
Сорри, не заметил сразу.
Тогда никак, придется явно кастить указатель к типу функции.
Та же беда с шаблонными функциями, кстати.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: boost::bind не вижу коряги
От: Roman Odaisky Украина  
Дата: 19.03.09 07:48
Оценка: +3
Здравствуйте, Аноним, Вы писали:

А>
А>std::for_each(out_md.begin(),out_md.end(),boost::bind(
А>    static_cast<UMC::VideoData::Status (UMC::VideoData::*)(Ipp32s, Ipp32s, ColorFormat ,Ipp32s)>(&UMC::VideoData::Init)
А>    ,_1, pvd.info.clip_info.width,pvd.info.clip_info.height,cf,0); 
А>


А вот теперь объясните мне кто-нибудь, чем это лучше по сравнению с
for(whatever_iterator i = out_md.begin(); i != out_md.end(); ++i)
{
    i->Init(pvd.info.clip_info.width, pvd.info.clip_info.height, cf, 0);
}

а то и
BOOST_FOREACH(whatever_type const& i, out_md)
{
    i.Init(pvd.info.clip_info.width, pvd.info.clip_info.height, cf, 0);
}
?
До последнего не верил в пирамиду Лебедева.
Re[3]: boost::bind не вижу коряги
От: Аноним  
Дата: 19.03.09 09:02
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Здравствуйте, Аноним, Вы писали:


А>>
А>>std::for_each(out_md.begin(),out_md.end(),boost::bind(
А>>    static_cast<UMC::VideoData::Status (UMC::VideoData::*)(Ipp32s, Ipp32s, ColorFormat ,Ipp32s)>(&UMC::VideoData::Init)
А>>    ,_1, pvd.info.clip_info.width,pvd.info.clip_info.height,cf,0); 
А>>


RO>А вот теперь объясните мне кто-нибудь, чем это лучше по сравнению с

RO>
RO>for(whatever_iterator i = out_md.begin(); i != out_md.end(); ++i)
RO>{
    i->>Init(pvd.info.clip_info.width, pvd.info.clip_info.height, cf, 0);
RO>}
RO>


холивар?
отсутствием whatever_iterator i и скрытием реализации for_each, с введением лямбд в 0х отпадет необходимость в таких громоздких конструкциях и function будет нужен только для замыканий.
Re[4]: boost::bind не вижу коряги
От: skeptik_  
Дата: 20.03.09 12:43
Оценка:
Здравствуйте, Аноним, Вы писали:

А>холивар?

А>отсутствием whatever_iterator i и скрытием реализации for_each, с введением лямбд в 0х отпадет необходимость в таких громоздких конструкциях и function будет нужен только для замыканий.
Да я за такие байнды в детстве убивал из рогатки!

BTW, c новым for это будет читабельнее лямбды:

for( auto& element: out_md )
    element.Init( pvd.info.clip_info.width, pvd.info.clip_info.height, cf, 0 );
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.