模板类的子项也必须是模板类吗?

时间:2012-04-10 02:04:56

标签: c++ visual-studio templates visual-c++ inheritance

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

2 个答案:

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