C ++ 11 bind решение:
std::for_each(this->begin(), this->end(),
std::bind(&C::transformation, this, std::placeholders::_1));
C ++ 11 lambda решение:
std::for_each(this->begin(), this->end(),
[this] (T& i) { transformation(i); });
C ++ 14 общее решение лямбда :
std::for_each(this->begin(), this->end(),
[this] (auto&& i) { transformation(std::forward<decltype(i)>(i)); });
C ++ 98 решение bind1st + mem_fun :
std::for_each(this->begin(), this->end(),
std::bind1st(std::mem_fun(&C::transformation), this));
< hr> Примечание: вызовы this->begin()
и this->end()
квалифицируются с помощью this->
только потому, что в коде OP они являются функциями-членами шаблонного базового класса. Таким образом, эти имена примитивно просматриваются в глобальном пространстве имен. Любое другое событие this
является обязательным.
Вам нужно привязать указатель this
:
public:
void method()
{
for_each(this->begin(), this->end(), bind(&C::transformation, this, placeholders::_1));
}
Во-первых, не наследуют от стандартных контейнеров, они не предназначены для наследования (без виртуальных деструкторов и т. д.).
Во-вторых, и в отношении вашей проблемы , это потому, что указатель на функцию-член не совпадает с указателем на функцию. Причина в том, что функция-член имеет скрытый первый параметр, который становится указателем this
в функции. Самый простой способ решить эту задачу - сделать функцию static
.
Другим решением является использование функции std::bind
, которая появилась с C ++ 11:
for_each(this->begin(), this->end(),
std::bind(&C::transformation, this, std::placeholders::_1));
Если у вас нет , C ++ 11 (даже если вы отметили свой вопрос как таковой), то вы, вероятно, могли бы получить что-то, работающее с std::mem_fun
или std::bind1st
.