如何用模板解决这个循环继承问题?

时间:2015-02-18 23:58:16

标签: c++ class oop templates

我有以下课程:

template<class T>
class Base: public Root //this one abstract
{
    std::vector<std::shared_ptr<T>> components;
}

template<class T>
class Derived : Base<T> //this one not abstract
{
 //stuff
}

我正在建设:

Derived<Base<Root>> myDerived;
std::shared_ptr<Base<Root>> ptr_base;
ptr_base.reset(&myDerived); // -> ERROR

编译器给我:

error C2664: 'std::_Ptr_base<_Ty>::_Reset0' : cannot convert parameter 1 from 'model::Derived <T> *' to 'model::Base<T> *'

所以编译器似乎没有得到Derived<Base<Root>>也是Base<Root>,因为我试图做的是:

1。Base<Root> is Root来自Base

的定义

2. Derived<T> Base<T>来自Derived<T>

的定义

所以Derived<Base<Root>>Base<Root>

任何提示?

THKS。

2 个答案:

答案 0 :(得分:2)

Derive<T>Based<T>,因此Derived<Base<Root>>Base<Base<Root>>

现在的问题是:Base<Base<Root>>Base<Root>吗?

换句话说:Base<Base<Root>>来自Base<Root>

或等效:Base<A>来自Base<B>,A = Base<Root>且B = Root?

没有。 A派生自B,但Base<A>并非来自Base<B>

即使X继承Y,vector<X>也不会从vector<Y>派生出来。

答案 1 :(得分:1)

您似乎希望将Derived的模板参数(即Base<Root>)“上传”到Root。强制转换适用于对象,但模板参数不可能发生:专门化模板定义了一个与其他特殊化不同的新类型。

Derived<Base<Root>>可以投放到Base<Base<Root>>,但不能投放到Derived<some-ancestor-of-Base<Root>>

通常,如果Derived继承自Base,则AnyClass<Derived>无法投放到AnyClass<Base>