Compiler Fehler mit iterator: "Fehler: '... ::iterator' has no member named '...' "

Unten ist der code. Mehr relevanten bits liegen in der Klasse Edge und Vertex, mit dem Fehler werfen copy-Konstruktor unterhalb des ersten Blocks.
Ich weiß, für sicher, dass dies hat zu tun mit, wie ich rufe Ende und beginnen Sie, zu sehen, wie Sie sind vom Typ Vertex* Kante () - Klasse, und ich rufe Ihnen mit einem iterator vom Typ std::vector::Edge*>. Es ist etwas, Zeiger basiert.
Ja, das ist Klasse, aber es ist ein Klasse Projekt mit zu es und das ist nur ein Fehler habe ich bekommen, stecken. Vielen Dank im Voraus, ich bin wohl einfach nicht sehen, etwas, das offensichtlich aufgrund von Schlafentzug oder so etwas.

#ifndef GRAPH_H
#define GRAPH_H

#include <vector>
#include <limits>
#include <string>
#include <iostream>
#include <fstream>

using namespace std;

template <typename Object, typename Weight>
class graph {
public:

class Vertex;

class Edge {
  public:
    Edge(Vertex* v, Vertex* w, Weight setweight) {
      start = v;
      end = w;
      v->edge.push_back(this);
      w->inedge.push_back(this);
      weight = setweight;
      explored = false;
    }
    Edge() {
      explored = false;
    }
    Weight weight;
    Vertex* start;
    Vertex* end;
    bool explored;
};

class Vertex {
  public:
    Vertex(Object setelement) {
      level = 0;
      connectedcomponent = 0;
      element = setelement;
      back = NULL;
      explored = false;
    }
    Vertex() {
      level = 0;
      connectedcomponent = 0;
      back = NULL;
      explored = false;
    }
    Object element;
    vector<Edge*> edge;
    vector<Edge*> inedge;
    double value;
    size_t starttime, finishtime;
    size_t level;
    size_t connectedcomponent;
    float rank;
    Vertex* back;
    int color;
    bool explored;
};

private:

vector<Edge*> edge;

vector<Vertex*> vertex;

size_t counter;

public:
graph();

graph(graph& G);

~graph();

void reset();
void resetBack();
void resetValues();
void resetLevels();
void resetExplored();
void resetConnectedComponents();
vector<Vertex*> incidentVertices(Vertex* v);
vector<Edge*> incidentEdges(Vertex* v);
vector<Edge*> outgoingEdges(Vertex* v);
vector<Vertex*> adjacentVertices(Vertex* v);
size_t indegree(Vertex* v);
size_t outdegree(Vertex* v);
size_t degree(Vertex* v);
Vertex* startVertex(Edge* e);
Vertex* endVertex(Edge* e);

bool isAdjacent(Vertex* v, Vertex* w);

Vertex* insertVertex(Object o);
void insertEdge(Vertex* v, Vertex* w, Weight t);
void insertUndirectedEdge(Vertex* v, Vertex* w, Weight t);
void removeVertex(Vertex* v);
void removeEdge(Edge* e);

size_t numVertices();
size_t numEdges();
vector<Vertex*> vertices();
vector<Edge*> edges();

void print();
void read_file(std::string filename);
};

template <typename Object, typename Weight>
graph<Object, Weight>::graph() {//Default Constructor
    Edge();
    Vertex();
    counter = 0;
}

Copy-Konstruktor, erzeugt den Fehler (ich weiß, ist das iterator-basierte)

Graph.h:149:22: Fehler: "std::vector::Edge*, std::allocator::Edge*> >::iterator' has no member named 'start'
finden(it_edge.starten),finden(it_edge.Ende),(*(it_edge))->Gewicht));
^

Graph.h:149:40: Fehler: "std::vector::Edge*, std::allocator::Edge*> >::iterator' has no member named 'Ende'
finden(it_edge.starten),finden(it_edge.Ende),(*(it_edge))->Gewicht));
^

template <typename Object, typename Weight>
graph<Object, Weight>::graph(graph<Object, Weight>& G) {//Copy Constructor

    typename std::vector<graph<Object, Weight>::Vertex*>::iterator it_vert;

    for(it_vert = vertex.begin(); it_vert != vertex.end(); ++it_vert){
      vertex.push_back(new Vertex((*(it_vert))->element));
    }

    typename std::vector<graph<Object, Weight>::Edge*>::iterator it_edge;

    for(it_edge = edge.begin(); it_edge != edge.end(); ++it_edge){
      edge.push_back(new Edge(
      find(it_edge.start),find(it_edge.end),(*(it_edge))->weight));
    }

}
Das habe ich versucht, aber bekam Graph.h:149:23: error: request for member 'start' in '* it_edge.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator-><Grafik<char, int>::Edge**, std::vector<Grafik<char, int>::Edge*, std::allocator<Grafik<char, int>::Edge*> > >()", auf die der Zeiger-Typ " graph<char, int>::Edge*' I ' ve run out of Ideen, wie ich es nennen soll Anfang oder das Ende an dieser Stelle
Vielleicht können Sie mit der boost graph library? Es hat eine Menge Werkzeuge für den Umgang mit Grafiken.
Hmm es scheint, gibt es einige Störungen aus dem iterator zurückgeben von ref. (*it_edge)->start funktioniert. Ich werde versuchen, herauszufinden, warum mein ursprünglicher Vorschlag nicht funktioniert.

InformationsquelleAutor user3210680 | 2014-04-16

Schreibe einen Kommentar