2016-10-08 8 views
1

std::shared_ptr<void>에서 템플릿 std::shared_ptr<T>으로 "복사"하려고 할 때 실행됩니다. 그것은 다음과 같습니다std :: shared_ptr 초기화 <T> std :: shared_ptr <void>

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 :

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 
    } 
}; 

오류가이 말한다 비주얼 스튜디오 2015 커뮤니티

이이 상황에 대해 나에게 필요하다. I 클래스 "배우"와 파생 클래스 "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 만 복사하면됩니다.

+0

['static_pointer_cast'] (http://en.cppreference.com/w/cpp/memory/shared_ptr/pointer_cast)를 확인하십시오. 그러나 실제로이 작업을 수행 할 때는주의해야합니다. – krzaq

+0

_ "여기에 전체 코드를 붙여 넣을 수는 있지만 550 줄과 그 대부분은 중요하지 않습니다."[MCVE]를 만드는 방법에 대해 읽어보십시오. –

답변

1

당신은 static_pointer_cast를 사용할 수 있습니다

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

그것은이 캐스트가 법적으로 보장하기 위해 당신에게 달려은 (는 static_cast<U*>(m_pointer.get())만큼 법적으로 정의 된 것).

+0

고마워, 그게 내가 찾고 있던거야. Dzięki : D – RazzorFlame

관련 문제