我需要有一个类“LinkedSortedList”,它是“SortedList”的子类。SortedList 是一个模板类,那么我怎么能有一个不是模板的孩子呢?这里唯一的问题是我需要同时拥有 LinkedSortedList.h 和 .cpp,但显然你不能将模板的定义留在 .cpp 中,它们必须使用 .h 中的方法/函数声明来定义,所以我不会有 LinkedSortedList.cpp ....或者我只是一个彻头彻尾的白痴?
问问题
187 次
2 回答
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"
现在您可以即时编译任何类型的排序列表。
于 2012-04-10T02:35:36.473 回答
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)它混淆了你的代码。
于 2012-04-10T02:17:28.297 回答