我有以下课程:
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。
答案 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>
。