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));
}
}
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese versucht Zugriff auf ein Datenelement
start
des Objektsit_edge
.it_edge
ist ein iterator:Werden Sie wahrscheinlich wollen, um auf die Daten zuzugreifen Mitglied
start
desEdge
dieses iterator-Objekt (indirekt) Punkte zu.Wenn Sie einen Umweg über
*
um einen iterator, erhalten Sie (eine Referenz auf) das Objekt, das der iterator verweist:Benötigen Sie einen zweiten Umweg, um die
Edge
Objekt dieser Zeiger verweist auf:Dann können Sie auf die Daten zugreifen, Mitglied
start
dieses Objekt:Normalerweise
->
wird rekursiv angewendet, bis der operand ist ein Zeiger. Also ich dachte erst, dasswürde auch funktionieren.
Jedoch Standardbibliothek Iteratoren sind erforderlich, um zu implementieren
a->m
als(*a).m
[input.Iteratoren]/Tabelle 107. Daher wird der iterator-Klasse gibt einen Zeiger auf das element wies auf von seiner überlastetoperator->
:In den OP, wir haben
T == Edge*
, soT* == Edge**
, und das ist, warumnicht funktioniert. Allerdings
funktioniert einwandfrei, da es auch gilt, die zwei notwendigen indirections.
Ja, ich habe diese Fehler auch, wenn Sie versuchen, kompilieren Sie Ihr Programm. Ich dachte, Sie zeigte nur ein Teil von ihm hier. Die Funktion
find
tun, die Sie anrufen möchten?Ich war der Aufruf von std::find(). Das schien das problem zu sein. Wenn ich call Zeiger richtig, es wurde versucht zu finden, einen Vertex* Kante* vector. Ich landete ändern die code-Implementierung, welche das Problem behoben wurde, aber ich bin leider nicht immer die Tiefe Kopie, die ich wollte. Unabhängig davon, das Problem ist gelöst, ich danke Ihnen sehr.
Aufruf
std::find
zwei Argumente erfordert (also z.B.find((**it_edge).start, (**it_edge).end)
) und es erfordert, einschließlich der<algorithm>
header. Wie für die Tiefe Kopie: Das wäre viel einfacher, wenn Sie nicht besitzen raw-Pointer in dergraph
Klasse (z.B.vector<Edge*> edge; vector<Vertex*> vertex;
).ach ja, ich wollte versuchen, dass, aber es war nicht glücklich, das finden der Eckpunkte durch die edge Vektor. Ich werde überdenken meine Tiefe Kopie als ganzes von hier
InformationsquelleAutor dyp