模板类的子类必须也是模板类
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)它会混淆您的代码。
相关文章:
- 继承期间显示未知行为的子类
- 通过指向指针数组的指针访问子类的属性
- 从父类方法返回子类对象
- c++, 在子类中,如何在没有对象的情况下访问父类的方法?
- 将父类对象强制转换为子类的问题
- 避免在C++中重复子类定义
- 将QOpenGLWidget子类转换为使用Metal而不是OpenGL的子类是否可行?
- 如何初始化矢量的模板化子类
- C++ 继承:将子类传递给需要基类的函数并获取子类行为
- 有没有办法按值将纯抽象类的所有子类传递给 C++ 中的函数?
- 使用子类覆盖基类中定义的函数
- 子类地址等于虚拟基类地址?
- 将子类方法声明为基类的友元
- C++子类共享变量?
- 如何检查模板专用化是否是基本模板的子类?
- 仅让特定类'Fabric'构造类'Foo'及其所有子类的实例
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 如何在C++子类中访问父类的私有变量
- 将父类的子类的数据复制到具有相同父类的另一个类