Ошибка; ссылка на ссылку
От: srd  
Дата: 10.03.04 17:10
Оценка:
Пишу функцию такого вида:
void func(std::string str1, std::string str2)
{
}

Эта функция используется следующим образом:
std::for_each(v.begin(), v.end(), std::bind1st(std::ptr_fun(func), "строка"));

В таком виде всё работает. Но если сделать передачу параметров по ссылке, т.е.
void func(std::string &, std::string &)
или
void func(const std::string &, const std::string &)
, то при компиляции получаю такие ошибки:

...\include\functional(266): error C2529: '_Left' : reference to reference is illegal
...\include\functional(272): error C2529: '_Right' : reference to reference is illegal
...\include\functional(277): error C2529: '_Right' : reference to reference is illegal
...\include\functional(278): error C2535: 'std::binder1st<_Fn2>::result_type std::binder1st<_Fn2>::operator ()(std::binder1st<_Fn2>::argument_type & ) const' : member function already defined or declared
with
[
_Fn2=std::pointer_to_binary_function<std::string &,std::string &,void>
]

Подскажите, как обойти эту проблему?
Re: Ошибка; ссылка на ссылку
От: Юнусов Булат Россия  
Дата: 10.03.04 17:39
Оценка: +1
Здравствуйте, srd, Вы писали:

srd>Подскажите, как обойти эту проблему?


boost::bind, boost::ref, boost::cref
Re: Ошибка; ссылка на ссылку
От: Кодт Россия  
Дата: 10.03.04 17:56
Оценка:
Здравствуйте, srd, Вы писали:

srd>Пишу функцию такого вида:

srd>
srd>void func(std::string str1, std::string str2)
srd>{
srd>}
srd>

srd>Эта функция используется следующим образом:
srd>
std::for_each(v.begin(), v.end(), std::bind1st(std::ptr_fun(func), "строка"));

srd>В таком виде всё работает. Но если сделать передачу параметров по ссылке, т.е.
void func(std::string &, std::string &)
или
void func(const std::string &, const std::string &)
, то при компиляции получаю такие ошибки:


srd>Подскажите, как обойти эту проблему?


Ты имеешь дело с rvalue to const lvalue conversion (временного объекта, сконструированного из строкового литерала).
Так изволь объявить свою функцию как void func(const std::string&, const std::string&)

PS. Если ты переходишь на С++ с Borland Pascal — там такие параметры обозначаются как
procedure func(const str1: string, const str2: string);
... << RSDN@Home 1.1.2 stable >>
Перекуём баги на фичи!
Re[2]: Ошибка; ссылка на ссылку
От: srd  
Дата: 10.03.04 18:08
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Ты имеешь дело с rvalue to const lvalue conversion (временного объекта, сконструированного из строкового литерала).

К>Так изволь объявить свою функцию как void func(const std::string&, const std::string&)

В том то и дело, что ошибки вылазят в том случае, если я объявляю функцию как
void func(const std::string &, const std::string &) или void func(std::string &, std::string &). А если передавать параметры по значению, то всё ОК.
Re[3]: Ошибка; ссылка на ссылку
От: Кодт Россия  
Дата: 10.03.04 21:24
Оценка:
Здравствуйте, srd, Вы писали:

srd>В том то и дело, что ошибки вылазят в том случае, если я объявляю функцию как

srd>void func(const std::string &, const std::string &) или void func(std::string &, std::string &). А если передавать параметры по значению, то всё ОК.

Прости. У меня глаз замылился...

Действительно, это — проблема STL, а именно <functional>. Там довольно убого сделано автоматическое выведение типа (наверное, в расчёте на древние компиляторы).
Для карринга (связывания функций и их аргументов) удобнее пользоваться boost::bind и, если позволяет компилятор — boost::lambda.
... << RSDN@Home 1.1.2 stable >>
Перекуём баги на фичи!
Re[4]: Ошибка; ссылка на ссылку
От: srd  
Дата: 12.03.04 04:49
Оценка:
Спасибо всем за советы. Boost скачал и теперь с ним разбираюсь. Странно, что в книге Страуструпа есть аналогичные примеры и всё средствами STL.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.