2013-11-12 3 views
3

У меня есть два shared_ptrs классов U и Т, где Т является основой U.неявного преобразования shared_ptr

Это не является проблемой, чтобы сделать неявное преобразование из 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 : 

ошибка: нет подходящей функции для вызова 'static_pointer_cast (TPtr)'

Примечание: Шаблон станд :: __ shared_ptr < _Tp1, _Lp> станд :: static_pointer_cast (Const станд :: __ shared_ptr < _Tp2, _Lp> &)

Примечание: аргумент шаблона вычет/замена не удалась:

примечание: 'TPtr {ака повышение :: shared_ptr}' не является производным от 'сопзЬ станд :: __ shared_ptr < _Tp2, _Lp>'

Решение этой проблемы:

смешивание std::shared_ptr с boost::shared_ptr это не хорошая идея.

ответ

8

Да, используйте 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 который возвращает нулевой указатель, если преобразование не представляется возможным.

Смежные вопросы