#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.
}