【问题标题】:Must a child of a template class also be a template class?模板类的子类也必须是模板类吗?
【发布时间】:2012-04-22 08:35:55
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    我们假设您的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 SortedList&lt;int&gt;;完成。
    【解决方案2】:

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

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

    【讨论】:

    • 您可以在类定义之外定义模板方法的主体,如下所示: template class Printer { void print(); }; template void Printer::print() { ... } 通常将这些定义放在单独的文件中,并且它们必须包含在标题的末尾。由于它们没有被编译,foo.h 的内联定义的典型命名约定是 foo_inl.h
    • 我知道你可以在你的类体之外定义你的成员函数,但我从来没有见过他们在一个单独的文件中定义。我想这不是不合理的,只是一个偏好问题
    猜你喜欢
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 2011-10-08
    • 2021-12-18
    • 1970-01-01
    相关资源
    最近更新 更多