我在学习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();
你们知道我该怎么做吗?
您想做的事不可能直接实现,因为这两个
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泛型混淆。那是两个截然不同的概念。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句