如何在不指定模板类型的情况下声明通用抽象对象 class

How to declare an object of generic abstract class without specifying template type

我在学习 C++ 中的泛型时遇到了一些问题。

我想要实现的是拥有一个抽象泛型 class

template <typename T>
class MediaEditor {
    public: virtual ~MediaEditor() = default;
}

然后 2 个 class 扩展它

class ImageEditor: public MediaEditor<TypeA> {}

class VideoEditor: public MediaEditor<TypeB> {}

然后在我的 main() 中,我想像这样声明一个 MediaEditor 类型的指针:

MediaEditor* editor;

因为它是一个抽象 class,我认为不需要指定类型,但 gcc 告诉我必须指定类型参数,证明我错了。

所以他希望我这样声明:

MediaEditor<SomeType>* editor;

但我想要做的重点是不必指定这些参数并在以后使用例如:

editor = new ImageEditor();

你们知道我该怎么做吗?

你想做的事情直接做不到,因为那两个

class ImageEditor: public MediaEditor<TypeA> {}

class VideoEditor: public MediaEditor<TypeB> {}

是完全不相关的类型。另外MediaEditor<TypeA>MediaEditor<TypeB>是两种完全不同的类型。作为同一模板的实例化不会对类型施加任何关系(除了作为同一模板的实例化)。

如果你想要多态,解决方案和没有模板一样:使用公共基class:

class MediaEditorBase {};

template <typename T>
class MediaEditor : MediaEditorBase {}

现在你可以做

MediaEditorBase* x = new MediaEditor<int>();

PS:"generics in C++",严格来说C++没有"generics"。它们被称为模板,不应与 Java 泛型等混淆。这是两个截然不同的概念。