Ошибка при использовании for_each

#c #graph #foreach

#c #График #foreach

Вопрос:

В моем коде есть следующие 2 функции:

 bool num()
{
    return 0;
}

void setDFS()
{
    int i = 0;
    project3::Graph<string, string> g1;

    std::for_each(g1.Vertice1.begin(), g1.Vertice1.end(),num);

}
  

Что делает функция, так это то, что для каждой вершины в векторной Vertice1 она должна пока установить ее номер равным 0. Как только я начну обход графика, позже я увеличу num до пройденного количества.

Во время компиляции я получаю ошибку «ошибка C2197: ‘bool (__cdecl *)(void)’: слишком много аргументов для вызова».

 template <class VertexType, class EdgeType> class Vertex{
protected:
    VertexType vertice;
    EdgeType edge;

public:

};

std::vector<project3::Vertex<VertexType, EdgeType>*> Vertice1;
  

Комментарии:

1. Что такое тип Vertice1 ? Опубликуйте больше кода..

2. Это имя типа class Vertex: std::vector<project3::Vertex<VertexType, EdgeType>*> Vertice1;

3. Я знаю, что это не читается… Следовательно, я удалил ее.

Ответ №1:

алгоритм for_each получает унарную функцию, которая должна иметь следующую подпись:

 void function(Tamp;);
  

где T — тип элемента вектора g1.Vertice1:

 template <class VertexType, class EdgeType>
void num(project3::Vertex<VertexType, EdgeType>* v) {
  *v = 0; // <- Maybe v->set(0,0,0)
}
  

Комментарии:

1. К вашему сведению, здесь typename нет необходимости, void num(project3::Vertex<VertexType, EdgeType>* v) соответствует стандарту.

2. Хорошо, я удалю «typename» из аргумента num(). Спасибо.

Ответ №2:

Взято с сайта SGI:

For_each применяет функциональный объект f к каждому элементу в диапазоне [первый, последний); возвращаемое значение f, если таковое имеется, игнорируется.

И

Унарная функция — это своего рода функциональный объект: объект, который вызывается так, как если бы это была обычная функция C . Унарная функция вызывается с единственным аргументом.

Насколько я понял из документации, for_each конструкция выполнит итерацию по переданной коллекции и передаст текущий элемент вашей функции, в которой вам затем нужно соответствующим образом обновить переданный элемент.

Ответ №3:

Исходя из предыдущего опыта работы с, как мне кажется, той же программой / тем же пользователем, я бы сказал, что num должен принимать строковый аргумент, поскольку ему нужно с чем-то работать (посмотрите на объявление третьего аргумента метода std::for_each() в ваших заголовках).

Кроме того, если метод num() является частью объекта, я не думаю, что он будет работать напрямую (из-за неявного аргумента «this» C для функций-членов.)

Возможным решением является оболочка, не являющаяся членом, вокруг этой функции, например:

 void my_non_member(string str)
{
    myobj.my_member(str); // myobj is a reference to a Vertice object that must be  
    // initialised elsewhere.
}