2016-04-04 2 views
-2
void f(int i,const string& s){cout << i << s;} 

auto g = bind(f,2,_1); 

я получаю сообщение об ошибке, _1 не был объявлен в этой областиОшибка в заполнителе в качестве связующего

+8

Вы используете пространство имен std :: placeholders? – lauriys

+0

В то же время, если вы используете C++ 11 или выше, вы можете просто начать учиться писать lambdas. В конечном итоге они становятся менее запутанными, ИМО. – AndyG

+0

Это хороший пример, почему его хорошо набирать пространства имен и не использовать. Использование-декларация –

ответ

2

Хорошо:

using namespace std::placeholders; 
auto g = std::bind(f, 2, _1); 

Лучше:

auto h = std::bind(f, 2, std::placeholders::_1); 

Лучшие:

auto i = [](auto&& x) { f(2, x); }; 

Дополнительные бонусные баллы:

auto j = [](auto&& x) { 
    using type = std::decay_t<decltype(x)>; 
    f(2, std::forward<type>(x)); 
}; 
+0

Я пробовал, но кажется, что в вашем lambdas есть ошибка, параметр объявлен автоматически. Это C++ 14? –

+0

@MiloLu извините, да. это C++ 14. Для C++ 11 вы должны указать тип, в каком случае это будет auto i = [] (const string & x) {f (2, x); }; –

Смежные вопросы