在 C++ 中模板化列表

Posted

技术标签:

【中文标题】在 C++ 中模板化列表【英文标题】:Templating a List in C++ 【发布时间】:2021-10-17 12:18:30 【问题描述】:

我正在编写一个程序,该程序需要我不久前编写的 SkipList,但现在我需要将其模板化,因为它需要使用我创建的自定义类。我遇到的问题是在 List 类中创建节点。我在我所有的方法上都使用template <class t>,但我认为由于节点和SkipList 类都使用template <class t>,相同的class ts 会相互干扰。

在我的 SkipList.h 中,我有方法说

Node <t>* createnode<t>(t,int);

在SkipList.cpp中,方法说

template <class t>
Node<t>* SkipList<t>::createnode(t value, int level) 
    Node<t> *n = new Node<t>(value, level);
    return n;

这给了我在.h 文件中显示Template specialization requires 'template&lt;&gt;' 的错误,当我添加它时,它会替换要说的代码

template<> Node<t>* createnode<t>(t,int);

然后我的 .cpp 文件说没有函数定义了。

有谁知道我哪里出错或我错过了什么?非常感谢您的帮助。 我的 GitHub 是 here,如果有人需要澄清的话

【问题讨论】:

您似乎正试图在.cpp 文件中声明一个模板。这是行不通的。这不是您的问题,但很重要请参阅:***.com/questions/115703/… 另外两个信息块:***.com/questions/31816095/…***.com/questions/1452721/…,一个用于bits/stdc++,一个用于using namespace std; 【参考方案1】:

注意事项:

You can't define templates in .cpp files use headers。 using namespace std; 可以和 will lead to nasty things 尤其是当包含在这样的标题中时。 You shouldn't includebits/stdc++.h.

现在解决代码中的一些问题。我不确定template &lt;class t, class t&gt; 是否有效,但在这种情况下充其量是没用的。解决您的问题:是的,两个class ts 相互干扰,但您不需要两个不同的ts。您不能使用与List 的类型不匹配的t 创建Node&lt;t&gt;,可以吗?现在,即使您有需要的情况,您也可以使用template &lt;class T1, class T2&gt;

现在固定的实现如下所示:

template <class T>
class SkipList 
    int MAX_LEVEL;
    float p;
    Node<t>* header;
    int level;
public:
    SkipList<T>(int,float)  /* Include definition here */
    int randomlevel()  /* Include definition here */
    void insert(T)  /* Include definition here */
    void remove(T)  /* Include definition here */
    bool find(T)  /* Include definition here */
    void print()  /* Include definition here */
    Node<T>* createnode(T, int)  /* Include definition here */
;

同样Node 也应该被修复(包括构造函数的定义)。

您在帖子中提到的另一件事是模板专业化。你可以阅读它here。

您的Node/SkipList 类之间的某处也存在内存泄漏。考虑转向智能指针。

Finally I strongly encourage that you go through the basics of C++ before you continue。在你能走路之前你不能跑。

【讨论】:

以上是关于在 C++ 中模板化列表的主要内容,如果未能解决你的问题,请参考以下文章

在“char 类型”模板化类中使用字符串文字

函数模板参数的C++模板实例化

C++学习34 模板类

C++模板类模板的全部特例化和局部特例化(偏特化-partial specialization)

快速、模板化、C++ 八叉树实现

C++模板