Пишу функцию такого вида:
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>
]
Подскажите, как обойти эту проблему?
Здравствуйте, 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 >>
Здравствуйте, 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 >>
Спасибо всем за советы. Boost скачал и теперь с ним разбираюсь. Странно, что в книге Страуструпа есть аналогичные примеры и всё средствами STL.