Я продолжаю получать сообщение об ошибке при попытке передать функцию внутри цикла for_each. У меня есть вектор, и я использовал цикл for_each для прохождения строк в этом векторе. Теперь мне нужна функция, чтобы что-то сделать
Например, это то, чего я пытаюсь достичь:
void DataPartitioning::doSomething()
{
for_each (label.begin(), label.end(), addToTemporaryVector());
}
void DataPartitioning::addToTemporaryVector()
{
cout<<"sucess";
}
Но я получаю сообщение об ошибке: error: недопустимое использование выражения void, оба из которых в одном классе.
Вы должны использовать структуру, как здесь:
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 в ссылке)
Поскольку это функция-член, вам нужно обернуть ее в функтор, который вызывает ее на объекте; предположительно тот же объект, что и 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));
Я не совсем уверен, будет ли это работать с такой функцией, как ваша, которая не принимает аргументацию; но, по-видимому, ваш реальный код действительно принимает аргумент, чтобы что-то делать с каждым элементом.
Функция addToTemporaryVector
не использует this
. Таким образом, вы можете объявить его статичным.
Кроме того, в качестве аргумента следует использовать шаблон типа label
Декларация:
static void addToTemporaryVector(const SomeType & item);
Затем просто выполните:
//No parentheses to the function pointer
for_each (label.begin(), label.end(), addToTemporaryVector);