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
a
Base

换句话说:
Base
是否源自
Base

或者等价地:
Base
是否源自
Base
,其中A=
Base
和B=根

否。A派生自B,但
Base
不是派生自
Base


正如
向量
不是从
向量
派生出来的一样,即使X继承了Y。

这不是答案,但
的析构函数应该是虚拟的。在另一种情况下,
shared\u ptr
不会调用
Derived
的析构函数,如果继承是这样应用的,
Derived
将是
Base
模板类派生:public t
。现在的情况是,您最终得到的是
派生:Base