如何实现class模板的前向声明

How to achieve forward declaration of class template

我正在尝试使用嵌套 Classes VertexEdge 创建 Graph class。我想让我的 Vertex class 接受通用参数。我已经转发声明了我的 Vertex class 以便我可以在我的 Edge Class.

中使用它

当我使用模板时,我遇到了一些我不确定如何解决的错误。

这是我试过的。每行旁边的错误都被注释掉了。

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);
        }
};

你能帮我指出我做错了什么吗?我该如何修复此代码?

前向声明看起来不错。问题是你不能声明"template member variable",你怎么能为它们指定模板参数呢?

您应该制作 class 模板。

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

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

classEdge也一样。

LIVE