C++ 如何使用模板解决此循环继承问题?
我有以下课程:C++ 如何使用模板解决此循环继承问题?,c++,class,oop,templates,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 } 模板 类基:public Root
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
}
模板
类基:public Root//这一个抽象
{
std::向量分量;
}
模板
派生类:Base//此类不是抽象类
{
//东西
}
我正在建造:
Derived<Base<Root>> myDerived;
std::shared_ptr<Base<Root>> ptr_base;
ptr_base.reset(&myDerived); // -> ERROR
Derived-myDerived;
std::共享的ptr ptr基础;
ptr_base.reset(&myDerived);//->错误
请告诉我:
error C2664: 'std::_Ptr_base<_Ty>::_Reset0' : cannot convert parameter 1 from 'model::Derived <T> *' to 'model::Base<T> *'
错误C2664:'std::Ptr_base::_Reset0':无法将参数1从'model::Derived*'转换为'model::base*'
因此,编译器似乎没有意识到,派生的
也是基的
,因为在我试图做的事情中:
1.Base是Base定义的根
2.Derived
是Base
来自Derived
所以派生的
是基础的
有什么提示吗
Thks.您似乎期望
派生的的模板参数,即基,被“上铸”为根。强制转换适用于对象,但不适用于模板参数:专门化模板定义了不同于其他专门化的新类型
派生的
可以强制转换为基础
,但不能转换为派生的
一般来说,如果派生的
继承自基本的
,那么任何类
不能被强制转换为任何类
,派生的
是基于的
,因此派生的
是基本的
现在的问题是:Base
aBase
换句话说:Base
是否源自Base
或者等价地:Base
是否源自Base
,其中A=Base
和B=根
否。A派生自B,但Base
不是派生自Base
正如向量
不是从向量
派生出来的一样,即使X继承了Y。这不是答案,但基
的析构函数应该是虚拟的。在另一种情况下,shared\u ptr
不会调用Derived
的析构函数,如果继承是这样应用的,Derived
将是Base
:模板类派生:public t
。现在的情况是,您最终得到的是派生:Base
。