2016-08-23 69 views
2

我正嘗試使用嵌套類VertexEdge創建Graph類。我想讓我的Vertex類接受通用參數。我已經向前宣佈我的Vertex課程,以便我可以在我的Edge課程中使用它。如何實現模板類的前向聲明

當我使用模板時,出現一些我不確定如何解決的錯誤。

這是我試過的。錯誤在每行旁邊註釋掉。

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

謝謝。我得到了解決方案。但我不太明白。你能解釋一下模板是什麼意思? 即模板 class Vertex; vector >頂點; 非專業術語。對不起,這真讓我感到困惑。 – SyncMaster

+0

即如果我的數據是字符串類型,那麼'E'和'T'都是字符串對嗎? – SyncMaster

+1

@SyncMaster如果你使用'Graph'如'Graph g;',那麼模板參數'E'將是'std :: string',成員'vertices'將是'vector >'。然後在'Vertex'中,'_data'將是'std :: string','_edges'將會是'vector >'。 – songyuanyao