Наличие функции внутри оператора for_each

0

Я продолжаю получать сообщение об ошибке при попытке передать функцию внутри цикла for_each. У меня есть вектор, и я использовал цикл for_each для прохождения строк в этом векторе. Теперь мне нужна функция, чтобы что-то сделать

Например, это то, чего я пытаюсь достичь:

void DataPartitioning::doSomething()
{
    for_each (label.begin(), label.end(), addToTemporaryVector());
}

void DataPartitioning::addToTemporaryVector()
{
    cout<<"sucess";
}

Но я получаю сообщение об ошибке: error: недопустимое использование выражения void, оба из которых в одном классе.

  • 1
    Вам нужно передать функцию, а не результат ее вызова. Но обратите внимание, что передать функцию-член сложно, потому что ей нужен объект, чтобы действовать.
  • 0
    так вы имеете в виду, я должен создать структуру и включить в нее функцию?
Показать ещё 5 комментариев
Теги:

3 ответа

0

Вы должны использовать структуру, как здесь:

http://en.cppreference.com/w/cpp/algorithm/for_each

#include <iostream>
#include<string>

#include <vector>
#include <algorithm>
using namespace std;

struct Operation
{
    void operator()(string n) { cout<<"success"<<endl; }
};

int main() {
    vector<string> vInts(10,"abc");
  std::for_each(std::begin(vInts), std::end(vInts), Operation());   
    // your code goes here
    return 0;
}

Обратите внимание, что вход оператора должен быть таким же, как и тип вектора. (строка в этом примере, int в ссылке)

0

Поскольку это функция-член, вам нужно обернуть ее в функтор, который вызывает ее на объекте; предположительно тот же объект, что и doSomething:

for_each(label.begin(), label.end(), [this](whatever const &){addToTemporaryVector();});

где whatever от типа значения контейнера.

Это может быть яснее обычного цикла for:

for (whatever const & thing : label) {
    addToTemporaryVector();
}

Это предполагает, что вы не застряли в компиляторе pre-С++ 11. Если да, то для этого требуется скорее больше тарабарщины:

for_each(label.begin(), label.end(),
    std::bind1st(std::mem_fun(&DataPartitioning::addToTemporaryVector), this));

Я не совсем уверен, будет ли это работать с такой функцией, как ваша, которая не принимает аргументацию; но, по-видимому, ваш реальный код действительно принимает аргумент, чтобы что-то делать с каждым элементом.

0

Функция addToTemporaryVector не использует this. Таким образом, вы можете объявить его статичным.

Кроме того, в качестве аргумента следует использовать шаблон типа label

Декларация:

static void addToTemporaryVector(const SomeType & item);

Затем просто выполните:

//No parentheses to the function pointer
for_each (label.begin(), label.end(), addToTemporaryVector);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню