在 C++ 中模板化列表
Posted
技术标签:
【中文标题】在 C++ 中模板化列表【英文标题】:Templating a List in C++ 【发布时间】:2021-10-17 12:18:30 【问题描述】:我正在编写一个程序,该程序需要我不久前编写的 SkipList,但现在我需要将其模板化,因为它需要使用我创建的自定义类。我遇到的问题是在 List 类中创建节点。我在我所有的方法上都使用template <class t>
,但我认为由于节点和SkipList 类都使用template <class t>
,相同的class t
s 会相互干扰。
在我的 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<>'
的错误,当我添加它时,它会替换要说的代码
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 <class t, class t>
是否有效,但在这种情况下充其量是没用的。解决您的问题:是的,两个class t
s 相互干扰,但您不需要两个不同的t
s。您不能使用与List
的类型不匹配的t
创建Node<t>
,可以吗?现在,即使您有需要的情况,您也可以使用template <class T1, class T2>
。
现在固定的实现如下所示:
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++ 中模板化列表的主要内容,如果未能解决你的问题,请参考以下文章