我需要一个“LinkedSortedList”类,它是“SortedList”的子代。 SortedList是一个模板类,那么我怎样才能拥有一个不是模板的孩子呢?这里唯一的问题是我需要同时拥有LinkedSortedList.h和.cpp,但显然你不能在.cpp中保留模板的定义,它们必须用.h中的方法/函数声明来定义,所以我不会有LinkedSortedList.cpp ....或者我只是一个完全白痴?
答案 0 :(得分:2)
好吧,我们假设您的LinkedSortedList
只能使用int
类型(否则它本身需要一个模板)。
首先,编译器需要知道SortedList<int>
必须在sorted_list.cpp
(或实现模板的时候)可用时编译。编译完成后,链接器将找到它并能够成功链接它。
所以在linked_sorted_list.h
你会有类似的东西:
#include "sorted_list.h"
class LinkedSortedList : public SortedList<int> {
...
}
在sorted_list.cpp
中,最后您必须包含以下一行:
template class SortedList<int>;
或者(这是更好的方法)您可以将模板的定义放入具有特殊扩展名的文件中(我倾向于使用.icc
),该文件包含在sorted_list.h
中:
template <class type>
class SortedList {
...
}
#include "sorted_list.icc"
现在您可以动态编译任何类型的排序列表。
答案 1 :(得分:0)
您只能从完全定义的类派生,而不是从类模板派生。这意味着代码
template <class C>
struct A{};
struct B : public A{};
无效。但是,两者都
struct B : public A<int>{};
template <class C>
struct B : public A<C>{};
有效。所以看起来你会被模板困住。如果确实希望拥有.cpp文件,则可以将代码移动到.cpp中,然后将其包含在.h文件中(在类定义之后)。我不推荐它,因为(IMO)它会混淆你的代码。