【问题标题】:How to achieve forward declaration of class template如何实现模板类的前向声明
【发布时间】:2016-12-29 22:46:36
【问题描述】:

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

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

【问题讨论】:

  • 简化问题:看看如何声明不需要前向声明的模板数据成员。
  • 你不能有非静态的模板变量...

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


【解决方案1】:

前向声明看起来不错。问题是您不能声明“模板成员变量”,如何为它们指定模板参数?

你应该改为制作类模板。

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

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

Edge 类也一样。

LIVE

【讨论】:

  • 谢谢。我得到了解决方案。但我不太明白。你能解释一下模板 Graph 是什么意思吗?即模板 类顶点;矢量 > 顶点;用外行的话来说。抱歉,这让我很困惑。
  • 即如果我的数据是字符串类型,那么 'E' 和 'T' 都将是字符串吗?
  • @SyncMaster 如果你像Graph&lt;std::string&gt; g;一样使用Graph,那么模板参数E就是std::string,成员vertices就是vector&lt;Vertex&lt;std::string&gt;&gt;。然后在Vertex_data 将是std::string_edges 将是vector&lt;Edge&lt;std::string&gt;&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-18
  • 1970-01-01
  • 2014-04-22
相关资源
最近更新 更多