2016-08-23 27 views
2

入れ子クラスVertexEdgeを使用してGraphクラスを作成しようとしています。 Vertexクラスをジェネリックパラメータを受け入れるようにしたいと思います。私は私のEdgeクラスで使用できるように私はVertexクラスを宣言しました。テンプレートクラスの前方宣言を達成する方法

テンプレートを使用すると、解決方法がわからないエラーはほとんど発生しません。

これは私が試みたものです。エラーは各行の隣にコメントアウトされています。

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

     template <class T> 
     vector<Vertex<T> > vertices; // Err: member 'vertices' declared as a template 

     class Edge 
     { 
      public: 
       template <class T> 
       Vertex<T>& _orig; // Err: member '_orig' declared as a template 

       template <class T> 
       Vertex<T>& _dest; // Err: member '_dest' declared as a template 

       template <class T> 
       Edge(Vertex<T>& orig, Vertex<T>& dest) : _orig(orig), // Err: member initializer '_orig' does not name a non-static data member or base class 
                 _dest(dest) { } 

       template <class T> 
       Vertex<T>& getOrig() { return _orig; } // Err: use of undeclared identifier '_orig' 

       template <class T> 
       Vertex<T>& getDest() { return _dest; } // Err: use of undeclared identifier '_dest' 
     }; 

     template <typename T> 
     class Vertex 
     { 
      public: 
       T _data; 
       vector<Edge> _edges; 

       Vertex(T data) : _data(data) { } 

       void addEdgeToVertex(Edge& edge) 
       { 
        _edges.push_back(edge); 
       } 
     }; 

    public: 
     template <typename T> 
     void addEdge(Vertex<T>& orig, Vertex<T>& dest) 
     { 
      Edge edge(orig, dest); 
      orig.addEdgeToVertex(edge); 
      dest.addEdgeToVertex(edge); 
     } 
}; 

私が間違っていることを指摘してもらえますか?このコードを修正するにはどうしたらいいですか?

+0

問題を簡素化:前方宣言を必要としないテンプレートデータメンバを宣言する方法を参照してください。 – juanchopanza

+1

静的でないテンプレート変数を使用することはできません。 –

答えて

2

前方宣言は正常です。問題は、「テンプレートメンバー変数」を宣言できないことです。どのようにテンプレート引数を指定できますか?

代わりにクラステンプレートを作成する必要があります。

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

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

クラスEdgeでも同じです。

LIVE

+0

ありがとうございます。私は解決策を得た。しかし、私はそれをかなり理解していません。テンプレートグラフの意味を教えてください。 すなわちテンプレート クラスVertex; ベクトル>頂点;素人の言葉で 申し訳ありませんが、これは本当に私に混乱しています。 – SyncMaster

+0

つまり、データが文字列型の場合、 'E'と 'T'の両方が文字列になりますか? – SyncMaster

+1

@SyncMaster 'Graph g;'のように 'Graph'を使うと、テンプレートパラメータ' E'は 'std :: string'、メンバ' vertices'は 'vector >'になります。 'Vertex'では' _data'は 'std :: string'、' _edges'は 'vector >'になります。 – songyuanyao

関連する問題