Как мне связать функцию-член для использования с std::for_each?

#c #stl #foreach #bind

#c #stl #foreach #привязать

Вопрос:

Моя цель — использовать функцию-член в for_each вызове. Итак, я сделал это так:

 for_each(an_island->cells.cbegin(),an_island->cells.cend(),std::bind(amp;nurikabe::fill_adjacent,this));
 

но это то, что я получаю в GCC:

 In file included from /usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c  /4.5.1/algorithm:63:0,
                 from prog.cpp:10:
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c  /4.5.1/bits/stl_algo.h: In function '_Funct std::for_each(_IIter, _IIter, _Funct) [with _IIter = std::_Rb_tree_const_iterator<std::pair<int, int> >, _Funct = std::_Bind<std::_Mem_fn<int (nurikabe::*)(std::pair<int, int>)>(nurikabe*)>]':
prog.cpp:85:103:   instantiated from here
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c  /4.5.1/bits/stl_algo.h:4185:2: error: no match for call to '(std::_Bind<std::_Mem_fn<int (nurikabe::*)(std::pair<int, int>)>(nurikabe*)>) (const std::pair<int, int>amp;)'
 

и в VS2010 это :

 xxresult(28): error C2825: '_Fty': must be a class or namespace when followed by '::'
 

Полный исходный код здесь

Любая помощь?

Ответ №1:

nurikabe::fill_adjacent эффективно принимает два аргумента — a nurikabe* и a cell — но вы передаете только первый. Используйте заполнитель для cell , например, так:

 for_each(
    an_island->cells.cbegin(),
    an_island->cells.cend(),
    std::bind(amp;nurikabe::fill_adjacent, this, _1)
);
 

(Обратите внимание, что _1 он находится в пространстве std::placeholders имен .)

Комментарии:

1. @vivek : Правильно, вот почему я упомянул, в каком пространстве имен она находится — чтобы вы знали, как ее полностью квалифицировать или для какого пространства имен создать директиву using. :-]