模板类的子类必须也是模板类

Must a child of a template class also be a template class?

本文关键字:子类      更新时间:2023-10-16

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

好吧,让我们假设您的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"

现在,您可以即时编译任何类型的排序列表。

只能从完全定义的类派生,而不能从类模板派生。 这意味着代码

    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)它会混淆您的代码。