2012-04-24 11 views
0

以下を使用する代わりに使用できますか?pin_ptr reinterpret_castまたはstatic_castを使用して(void **)の代わりに?

class IGraphBuilder; 

public ref class Device 
{ 
private: 
    IGraphBuilder* pGraphBuilder; 

public: 
    void Configure() 
    { 
     pin_ptr<IGraphBuilder*> ppGraphBuilder = &pGraphBuilder; 

     HRESULT hr = CoCreateInstance(CLSID_FilterGraph, 
      NULL, 
      CLSCTX_INPROC, 
      IID_IGraphBuilder, (void**)ppGraphBuilder); 

reinterpret_castは(ppGraphBuilder)はコンパイルが、これはこの場合のために正しいかどうか、私は少し困惑しています。

これはC++/CLI(&NativeMemberが実際にinterior_ptr<Type>(NativeMember)を意味する)でなかった場合、私は単にstatic_cast<void**>(&pGraphBuilder)を使用しますが、後でも正しく次は

pin_ptr<IGraphBuilder*> ppGraphBuilder = &pGraphBuilder; 
static_cast<void**>(ppGraphBuilder) 

をコンパイルしませんpin_ptrにキャストすると、任意の溶液またはAMがあります私はpin_ptrが奇妙なので、(void **)を使うように強制されましたか?

答えて

1

reinterpret_cast(したがってCキャスト)は潜在的にはOKではありませんが、pin_ptrという些細なレイアウトのために動作する可能性があります。実際には、最初にcli::pin_ptr<IGraphBuilder*>からIGraphBuilder**に変換演算子を呼び出さなければなりません(したがって、コンパイラからの不満)。

reinterpret_cast<void**>(static_cast<IGraphBuilder**>(ppGraphBuilder)) 

が正しい。 「static_castを」:「についてのボイド**」 `このスレッドの話に「IGraphBuilder **」から変換することはできません` C2440にエラーがあることこう

pin_ptr<IGraphBuilder*> p = &pGraphBuilder; 
IGraphBuilder** ppGraphBuilder = p; 

HRESULT hr = CoCreateInstance(CLSID_FilterGraph, 
     NULL, 
     CLSCTX_INPROC, 
     IID_IGraphBuilder, reinterpret_cast<void**>(p)); 
+0

:あなたは、最初のタイプIGraphBuilder**の仲介変数を導入することもできます同じ問題... http://stackoverflow.com/questions/3625410/c-static-cast-from-float-to-void/ – NtscCobalt

+0

@ NtscCobalt:あなたはそうです。第2のキャストには 'reinterpret_cast'を使用しなければなりません。これは技術的に2つのコンバージョンが必要であるという事実は変わりません。 –

+0

は 'reinterpret_cast 'です。この場合、最初に 'IGraphBuilder **'にキャストしても安全ですか? – NtscCobalt

関連する問題