2016-08-23 4 views
2

Ich versuche, eine Graph Klasse zu erstellen, indem Sie die geschachtelten Klassen Vertex und Edge verwenden. Ich möchte meine Klasse Vertex generische Parameter akzeptieren. Ich habe nach vorne meine Vertex Klasse deklariert, so dass ich es in meiner Edge Klasse verwenden kann.So erreichen Sie die Vorwärtsdeklaration der Vorlagenklasse

Wenn ich Vorlagen verwende, erhalte ich einige Fehler, von denen ich nicht sicher bin, wie sie gelöst werden sollen.

Hier ist was ich versucht habe. Die Fehler werden neben jeder Zeile auskommentiert.

Können Sie mir bitte helfen, aufzuzeigen, was ich falsch mache? Wie kann ich diesen Code reparieren?

+0

das Problem Vereinfachen: sehen, wie eine Vorlage Datenelement zu erklären, die keine Vorwärtsdeklaration erfordert. – juanchopanza

+1

Sie können keine Template-Variablen haben, die nicht statisch sind ... –

Antwort

2

Die Forward-Deklaration sieht gut aus. Das Problem ist, dass Sie nicht "Template-Member-Variable" deklarieren können, wie könnten Sie das Template-Argument für sie angeben?

Sie sollten stattdessen eine Klassenvorlage erstellen.

template <class E> 
class Graph 
{ 
    private: 
     template <class T> 
     class Vertex; // Forward Declaration 

     vector<Vertex<E> > vertices; 
    ... 
}; 

Es ist dasselbe für Klasse Edge auch.

LIVE

+0

Danke. Ich habe die Lösung. Aber ich verstehe es nicht ganz. Können Sie bitte erklären, was Vorlage Graph bedeutet? , d. H. Vorlage Klasse Vertex; Vektor > Ecken; in Laienzeit. Tut mir leid, das ist wirklich verwirrend für mich. – SyncMaster

+0

, d. H. Wenn meine Daten vom Typ string sind, dann sind sowohl 'E' als auch 'T' string right? – SyncMaster

+1

@SyncMaster Wenn Sie 'Graph' wie 'Graph g;' verwenden, dann ist der Template-Parameter 'E'' std :: string', der Member 'Vertices' ist' vector > '. Dann wird in 'Vertex'' _data' 'std :: string',' _edges' wird 'vector >'. – songyuanyao

Verwandte Themen