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

时间:2016-08-23 08:01:02

标签: c++ templates inner-classes forward-declaration

我正在尝试使用嵌套类GraphVertex创建Edge类。我想让我的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);
        }
};

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

1 个答案:

答案 0 :(得分:2)

前瞻声明看起来很好。问题是你不能声明“模板成员变量”,你怎么能为它们指定模板参数?

您应该改为使用类模板。

Pool

对于班级template <class E> class Graph { private: template <class T> class Vertex; // Forward Declaration vector<Vertex<E> > vertices; ... }; 也是如此。

LIVE