Инициализировать std :: shared_ptr & lt; T & gt; из std :: shared_ptr & lt; void & gt;

Я сталкиваюсь с этим при попытке «скопировать» из std::shared_ptr<void> к шаблону std::shared_ptr<T>, Это выглядит так:

template < >
class TDynamic< void >
{
protected:
std::shared_ptr< void > m_pointer;
public:
// Here i got constructors, functions etc
template < typename U >
TDynamic< U > SwitchType()
{
TDynamic< U > returnValue;
returnValue.m_pointer = std::shared_ptr< U >(m_pointer); // error here
}
};

Ошибка говорит это:

c:\...path_here...\tdynamic.hpp(426): error C2440: 'type cast': cannot convert from 'const std::shared_ptr< void >' to 'std::shared_ptr< T >'
1>          with
1>          [
1>              T=grim::Actor
1>          ]
1>  c:\...path_here...\tdynamic.hpp(426): note: No constructor could take the source type, or constructor overload resolution was ambiguous

составитель & IDE: сообщество Visual Studio 2015

Это необходимо для меня в этой ситуации. Допустим, у меня есть класс «Актер» и производный класс «APlayer»

class Actor
{
public:
};
class APlayer
: public Actor
{
public:
};

int main()
{ // some code here
TDynamic< APlayer > test1(new APlayer);
TDynamic< void > test2(test1);
TDynamic< Actor > test3(test2); // error here
}

Я мог бы вставить весь код здесь, но он как 550 строк, и большинство из них не имеет значения. Мне просто нужно скопировать это std::shared_ptr,

1

Решение

Ты можешь использовать static_pointer_cast:

returnValue.m_pointer = static_pointer_cast<U>(m_pointer);

Это зависит от вас, чтобы гарантировать, что этот акт является законным (он определен как законный как static_cast<U*>(m_pointer.get())).

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector