7

我有两个 U 和 T 类的 shared_ptrs,其中 T 是 U 的基数。

shared_ptr<U>to进行隐式转换是没有问题的shared_ptr<T>。但是也可以从shared_ptr<T>to进行转换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 :

错误:没有用于调用“static_pointer_cast(TPtr)”的匹配函数

注意:模板 std::__shared_ptr<_Tp1, _Lp> std::static_pointer_cast(const std::__shared_ptr<_Tp2, _Lp>&)

注意:模板参数扣除/替换失败:

注意:'TPtr {aka boost::shared_ptr}' 不是从 'const std::__shared_ptr<_Tp2, _Lp>' 派生的

此问题的解决方案:

混合std::shared_ptr使用boost::shared_ptr不是一个好主意。

4

1 回答 1

12

是的,使用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如果无法进行转换,还有一个匹配项会返回一个空指针。

于 2013-11-12T15:05:26.027 回答