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

3
我正在尝试使用嵌套类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);
        }
};

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


简化问题:看看如何声明一个不需要前向声明的模板数据成员。 - juanchopanza
1
你不能有非静态的模板变量... - W.F.
1个回答

3
前置声明看起来不错。问题在于你不能声明"模板成员变量",你如何为它们指定模板参数?你应该使用类模板代替。
template <class E>
class Graph
{
    private:
        template <class T>
        class Vertex; // Forward Declaration

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

对于类Edge也是同样的情况。

点击此处查看实例


谢谢。我得到了解决方案。但我不太理解它。您能否请用通俗易懂的语言解释一下template <class E> Graph是什么意思? 例如:template <class T> class Vertex; vector<Vertex<E> > vertices; 非常抱歉,这对我来说真的很困惑。 - SyncMaster
如果我的数据类型是字符串,那么 'E' 和 'T' 都将是字符串,对吗? - SyncMaster
1
如果您使用类似于Graph<std::string> g;Graph,那么模板参数E将是std::string,成员vertices将是vector<Vertex<std::string>>。然后在Vertex中,_data将是std::string_edges将是vector<Edge<std::string>> - songyuanyao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接