bind для функции с "аргументом-ссылкой"
От: kvser  
Дата: 05.05.08 13:04
Оценка:
Здравствуйте!

class C
{
void f(T& t){...};
void c()
{
  std::for_each(s.begin(), s.end(), std::bind1st(std::mem_fun(&C::f), this)); //здесь ошибка: на то, что в f аргумент является ссылкой
}
};


используется gcc3.4.6
Вообщем поискал по форуму, нашел только указания использовать boost или STLPort — но не подходят эти варианты.

В какую обертку необходимо запихнуть результат работы mem_fun, чтобы в bind1st не было ошибок?
Re: bind для функции с "аргументом-ссылкой"
От: korzh.pavel Россия  
Дата: 05.05.08 13:08
Оценка:
Здравствуйте, kvser, Вы писали:

K>Здравствуйте!


K>
K>class C
K>{
K>void f(T& t){...};
K>void c()
K>{
K>  std::for_each(s.begin(), s.end(), std::bind1st(std::mem_fun(&C::f), this)); //здесь ошибка: на то, что в f аргумент является ссылкой
K>}
K>};
K>


K>используется gcc3.4.6

K>Вообщем поискал по форуму, нашел только указания использовать boost или STLPort — но не подходят эти варианты.

K>В какую обертку необходимо запихнуть результат работы mem_fun, чтобы в bind1st не было ошибок?


раз уж boost используешь, попробуй boost/functional.hpp — boost::mem_fun вместо std::mem_fun
Re[2]: bind для функции с "аргументом-ссылкой"
От: kvser  
Дата: 05.05.08 13:10
Оценка:
Здравствуйте, korzh.pavel, Вы писали:

KP>раз уж boost используешь, попробуй boost/functional.hpp — boost::mem_fun вместо std::mem_fun


наоборот хочу без буста
Re[3]: bind для функции с "аргументом-ссылкой"
От: korzh.pavel Россия  
Дата: 05.05.08 13:56
Оценка: 1 (1)
Здравствуйте, kvser, Вы писали:

K>Здравствуйте, korzh.pavel, Вы писали:


KP>>раз уж boost используешь, попробуй boost/functional.hpp — boost::mem_fun вместо std::mem_fun


K>наоборот хочу без буста


ой, что то меня проглючило — ты же буст не используешь.

ты столкнулся с архитектурной ошибкой stl'ных байндеров. Не любят они когда аргументы по ссылке передаются.
Победить только так:
template<class T> class reference_wrapper
{ 
public:
    reference_wrapper(T& t): m_t(&t) {}
    T& get() const { return *m_t; }
private:
    T* m_t;
};

class C
{
void f(reference_wrapper<T> t){...};
void c()
{
  std::for_each(s.begin(), s.end(), std::bind1st(std::mem_fun(&C::f), this)); 
}
};


Или переписать всё на цикл for(...)
Re[4]: bind для функции с "аргументом-ссылкой"
От: Roman Odaisky Украина  
Дата: 05.05.08 14:38
Оценка:
Здравствуйте, korzh.pavel, Вы писали:

KP>ты столкнулся с архитектурной ошибкой stl'ных байндеров. Не любят они когда аргументы по ссылке передаются.

KP>Победить только так:

Можно STLport поставить, там этот недочет исправлен. Или выbcpить соответствующий кусок из буста.
До последнего не верил в пирамиду Лебедева.
Re[5]: bind для функции с "аргументом-ссылкой"
От: kvser  
Дата: 06.05.08 04:43
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Можно STLport поставить, там этот недочет исправлен. Или выbcpить соответствующий кусок из буста.


я не хочу использовать STLPort, а может и зря
у него какие есть известные недочеты?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.