2016-10-08 26 views
1

std::shared_ptr<void>からテンプレートstd::shared_ptr<T>に「コピー」しようとすると実行されます。それは次のようになります。std :: shared_ptrを<T>からstd :: shared_ptrに初期化します。<void>

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コミュニティ

これは、このような状況のために私には必要です。私は全体のここでのコードが、その550のような行を貼り付けることができ、それのほとんどは問題ではありません、私はクラスの「アクター」と派生クラス「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 
} 

を考えてみましょう。私はちょうどその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

関連する問題