3

我需要有一个类“LinkedSortedList”,它是“SortedList”的子类。SortedList 是一个模板类,那么我怎么能有一个不是模板的孩子呢?这里唯一的问题是我需要同时拥有 LinkedSortedList.h 和 .cpp,但显然你不能将模板的定义留在 .cpp 中,它们必须使用 .h 中的方法/函数声明来定义,所以我不会有 LinkedSortedList.cpp ....或者我只是一个彻头彻尾的白痴?

4

2 回答 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 回答