shared_ptr的隐式转换

时间:2013-11-12 15:04:30

标签: c++ shared-ptr

我有两个类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_ptrboost::shared_ptr的混合不是一个好主意。

1 个答案:

答案 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,如果无法进行转换,则返回空指针。