【问题标题】:Use of class template node requires template arguments C++使用类模板节点需要模板参数 C++
【发布时间】:2021-12-28 16:03:18
【问题描述】:

我有两个用 C++ 定义的类,如下所示。

#include <vector>
#include <tuple>
#include <map>

template <class T> class node   {
public:
    int NodeID;  //ID used to identify node when inserting/deleting/finding.
    T data;  //generic data encapsulated in each node.
    std::vector<node*> children;  //child nodes, list of ptrs
    std::vector<node*> parents;  //parent nodes list of ptrs
};


class DAG {//Class for the graph

    std::vector<node*> Nodes;

}

但是,我在 DAG 中收到一条错误消息,提示“使用类模板节点需要模板参数”。我完全失去了任何帮助,非常感谢。

【问题讨论】:

  • node 是模板类。 node&lt;SomeType&gt; 是一种类型。如果你写node*node 类中的T 类型是什么?
  • 换句话说:node 不是一个类。它用作多个类的模板,您可以从node&lt;T&gt; 获得,T 是其他类型。另请注意,它们不共享一个公共基类,以防万一您想这样使用它们。提示:您可能想要一个template&lt;class T&gt; class DAG,其中包含一个vector&lt;node&lt;T&gt;*&gt; 作为成员。
  • 可能令人困惑的是, node 类中您只能使用node*。这是因为此时名称 node 指的是类本身,并且假定了其 T 参数。

标签: c++ templates


【解决方案1】:

解决方案 1

您可以通过在std::vector&lt;node*&gt; Nodes; 中指定类型来解决此问题,如下所示:

std::vector<node<int>*> Nodes; //note i have added int you can add any type

解决方案 2

另一种解决方案是将DAG 类设为类模板,如下所示:

template<typename T>
class DAG {//Class for the graph

    std::vector<node<T>*> Nodes;

};

【讨论】:

  • 感谢 Anoop,但是我是否正确理解这意味着每个单独的 DAG 对象将仅包含单一类型的节点?
  • @BenBorg 不客气。在我的第二个解决方案中,DAG 成为类模板。这意味着,例如,每个DAG&lt;T&gt; 对象都有一个名为Nodes 的数据成员,它将是std::vectornode&lt;T&gt;* 对象。所以假设我们有T=int,这意味着每个DAG&lt;int&gt; 对象将有一个名为Nodes 的成员,它将是类型为指向node&lt;int&gt; 的元素的std::vector(那是node&lt;int&gt;*)。
  • 是的,例如 DAG 会有节点,但我希望 DAG 有可以是任何类型的节点。
  • 模板无法做到这一点。您可以使用std::any,它提供类型擦除。另一种解决方案是创建一个类层次结构
  • @BenBorg 你应该/可以使用std::any 来达到这个目的。但我认为我目前的答案解决了你原来的问题。您应该针对修改后的要求提出一个单独的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多