Что происходит, так это то, что bind1st и mem_fun не работают со ссылками на всех платформах .
Вы можете использовать его с boost :: bind
std::for_each( arr, arr + sizeof(arr)/sizeof(int),
boost::bind( &D::incre, this, _1 ) );
и, казалось бы, GNU решила, что вышеприведенное - достаточно хороший обходной путь, чтобы пометить ошибку как "не исправленную".
В вашем случае вы можете передать по значению. Вы также можете с радостью передавать указатели на эти функции.
Кстати, то, что вы делаете, должно работать.
Передача по значению может и не исправить это, потому что вы вызываете неконстантную функцию-член. Также была проблема с неконстантными функциями-членами .
Ваша другая альтернатива, конечно, состоит в том, чтобы использовать std :: аккумулировать, а не std :: for_each, что подходит для этого конкретного случая, когда вы пробегаете свою коллекцию, генерирующую что-то. Я обычно предпочитаю использовать накопление:
Result r;
Result* binaryfunc( Result*, T value ); // returns the same pointer passed in
std::accumulate( coll.begin(), coll.end(), binaryfunc, &r );
, что позволяет избежать копирования «Результата» на каждой итерации. Здесь нет необходимости использовать bind1st или mem_fun, так что нет проблем, если вы передаете значение по ссылке.