我在学习C ++中的泛型时遇到一些麻烦。
我想要实现的是拥有一个抽象的泛型类
template <typename T>
class MediaEditor {
public: virtual ~MediaEditor() = default;
}
然后扩展2个类
class ImageEditor: public MediaEditor<TypeA> {}
class VideoEditor: public MediaEditor<TypeB> {}
然后在我的main()中,我想像这样声明MediaEditor类型的指针:
MediaEditor* editor;
由于它是一个抽象类,所以我认为不需要指定类型,但是gcc通过告诉我必须指定类型参数证明了我的错。
所以他希望我这样声明:
MediaEditor<SomeType>* editor;
但是我要执行的全部操作是不必指定这些参数,以后再使用例如:
editor = new ImageEditor();
你们知道我该怎么做吗?
答案 0 :(得分:1)
您想做的事不可能直接实现,因为那两个
class ImageEditor: public MediaEditor<TypeA> {}
class VideoEditor: public MediaEditor<TypeB> {}
是完全不相关的类型。 MediaEditor<TypeA>
和MediaEditor<TypeB>
也是两种完全不同的类型。作为同一模板的实例化不会对类型强加任何关系(除了作为同一模板的实例化之外)。
如果您想要多态性,则解决方案与没有模板时的解决方案相同:使用通用基类:
class MediaEditorBase {};
template <typename T>
class MediaEditor : MediaEditorBase {}
现在您可以做
MediaEditorBase* x = new MediaEditor<int>();
PS:“ C ++中的泛型”,严格来说,C ++没有“泛型”。它们被称为模板,不应与Java泛型混淆。这是两个截然不同的概念。