2012-04-24 2 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 다음에 캐스팅 모든 솔루션이 아니면 나는 것 pin_ptr이 이상하기 때문에 강제로 (void **) 사용합니까?

답변

1

reinterpret_cast (따라서 C 캐스트)은 아마도 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 : 네 말이 맞아. 하나는 두 번째 캐스트를 위해'reinterpret_cast'를 사용해야합니다. 이것은 기술적으로 두 가지 전환이 필요하다는 사실을 변경하지 않습니다. –

+0

이'reinterpret_cast '입니까?'IGraphBuilder **'에 처음으로 캐스팅 한 후 사용하는 것이 안전합니까? – NtscCobalt

관련 문제