C ++. Ошибки for_each c2672 и c3867 [duplicate]

2
задан Michal Špondr 29 September 2014 в 12:34
поделиться

3 ответа

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 является обязательным.

14
ответ дан Piotr Skotnicki 18 August 2018 в 22:26
поделиться

Вам нужно привязать указатель this:

public:   
void method() 
{
    for_each(this->begin(), this->end(), bind(&C::transformation, this, placeholders::_1));
}
0
ответ дан nvoigt 18 August 2018 в 22:26
поделиться

Во-первых, не наследуют от стандартных контейнеров, они не предназначены для наследования (без виртуальных деструкторов и т. д.).

Во-вторых, и в отношении вашей проблемы , это потому, что указатель на функцию-член не совпадает с указателем на функцию. Причина в том, что функция-член имеет скрытый первый параметр, который становится указателем 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 .

4
ответ дан Some programmer dude 18 August 2018 в 22:26
поделиться
  • 1
    Наследование со стандартных контейнеров прекрасное, если вы не используете полиморфизм. Полиморфизм - не единственная причина использования наследования, и могут быть полезные приложения наследования из стандартных контейнеров. – Nir Friedman 27 June 2015 в 20:05
Другие вопросы по тегам:

Похожие вопросы: