我有两个类U和T的shared_ptrs,其中T是U的基础。
从shared_ptr<U>
到shared_ptr<T>
的隐式转换没有问题。
但也可以从shared_ptr<T>
转换为shared_ptr<U>
吗?
我尝试过吸食的解决方案:
class T {
public:
virtual ~T() {}
protected:
void fillData() = 0;
};
class Timpl : public T
{
public:
virtual ~Timpl() {}
protected:
virtual void fillData() = 0;
};
class U : public Timpl {
public:
virtual ~U() {}
protected:
virtual void fillData() {...} // fill
};
typedef shared_ptr<T> TPtr
typedef shared_ptr<U> UPtr
TPtr tp = std::make_shared<U>();
UPtr up = std::static_pointer_cast<U>(tp); //<-- error here :
错误:没有匹配函数来调用&#39; static_pointer_cast(TPtr)&#39;
注意:模板std :: __ shared_ptr&lt; _Tp1,_Lp&gt; std :: static_pointer_cast(const std :: __ shared_ptr&lt; _Tp2,_Lp&gt;&amp;)
注意:模板参数扣除/替换失败:
注意:&#39; TPtr {aka boost :: shared_ptr}&#39;不是源自&#39; const std :: __ shared_ptr&lt; _Tp2,_Lp&gt;&#39;
此问题的解决方案:
std::shared_ptr
与boost::shared_ptr
的混合不是一个好主意。
答案 0 :(得分:9)
是的,请使用static_pointer_cast
:
#include <memory>
struct T { virtual ~T() {} };
struct U : T {};
std::shared_ptr<T> pt = std::make_shared<U>(); // *pt is really a "U"
auto pu = std::static_pointer_cast<U>(pt);
还有匹配的std::dynamic_pointer_cast
,如果无法进行转换,则返回空指针。