我有一个基本结构FooBase

struct FooBase { };


然后创建一个模板结构Foo,它是FooBase的子级:

template <typename typeName> struct Foo : public FooBase { typeName* foo };


在某些类中,我创建一个FooBase的向量,并在其中添加Foo的实例:

vector <FooBase> FooVector
...
Foo <Bar> fooInstance;
fooInstance.foo = new Bar();
FooVector.push_back ( fooInstance );


然后我需要访问存储的数据,但是关于foo中缺少成员FooBase的问题,我得到了可预见的明显错误

FooVector[0].foo


我不能写这样的东西

Foo <Bar> fooInstance = FooVector[0]


因为我不知道template参数。

如何在向量中存储Foo的实例,以便以后可以访问它们。请注意,从向量中读取数据时,我不知道最后一步的template参数。

附言不允许提升!

最佳答案

在这里发生的是

FooVector.push_back ( fooInstance );


一行,C ++静默调用FooBase的副本构造函数,因为您只能将这种类型的对象保留在向量中。由于Foo是从FooBase公开继承的,因此可以使用类型为FooBase::FooBase(FooBase const&)的对象调用方法Foo

因此,您并不是真正存储Foo,而是实际上存储了FooBase。要执行您想做的事情,您需要一个std::vector<FooBase*>std::vector<std::shared_ptr<FooBase> >

但是,向量的内容仍然缺少foo成员,因为静态类型仍然不是Foo。为了解决这个问题,您有一些选择。您可以将dynamic_cast static_castFooBase*放入Foo*,然后访问其foo成员。但这可能会中断,因为FooBase*指针实际上可能包含Foo以外的其他类型。

为什么不只使用std::vector<Foo<Bar> >呢?

09-27 23:18