假设我们有一个模板化的类,

template<typename Type>
class Container {};


当然,我们不能这样做:

struct Foo
{
    Container _container;
}


但是,如果我们想做类似的事情怎么办?这是定义基类的唯一方法,

class ContainerBase {};

template<typename Type>
class Container : public ContainerBase {};


并存储一个指针,如下所示?

struct Foo
{
    ContainerBase* _container;
}


这很简单,但是仅出于这个原因而不得不添加一个基类,这似乎很奇怪,因为看起来编译器应该具有足够的信息来暗示一组相关的专业知识。当然,无论_container需要是一个指针,否则Foo都无法解析为静态大小,但是

struct Foo
{
    Container* _container;
}


也不起作用。

最佳答案

似乎编译器应该具有足够的信息来暗示一组相关的专业知识。


不。除了名称,模板的专业化是完全无关的,类型的名称与运行时操作基本上没有关系。给定模板的专业化通常共享(主要是)通用接口,但是它们也可能完全不同。

如果要在各专业之间建立联系,则必须添加基类。如果它们有很多共同点,那么将功能纳入基础是一个不错的主意。

关于c++ - 通过定义基类来“多态”声明非专业模板类型的成员的唯一方法是吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25829404/

10-09 21:36