2012-04-24 71 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以下不編譯

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

有什麼解決辦法還是我我不得不使用(void **),因爲pin_ptr很奇怪?

回答

1

reinterpret_cast(因此C演員)可能不會好,雖然它可能工作,由於pin_ptr涉嫌平凡的佈局。事實上,你必須首先將轉換運算符從cli::pin_ptr<IGraphBuilder*>調用到IGraphBuilder**(因此編譯器會抱怨)。

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

是正確的。您可能要爲大家介紹IGraphBuilder**型第一的中介變量:

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

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

做,在'C2440錯誤:「的static_cast」:無法從「IGraphBuilder **」轉化爲對「無效**」'這個線程會談同樣的問題... http://stackoverflow.com/questions/3625410/c-static-cast-from-float-to-void/ – NtscCobalt 2012-04-24 21:57:36

+0

@NtscCobalt:你說得對。一個人必須爲第二個演員使用'reinterpret_cast'。這在技術上並沒有改變這個事實,你需要兩次轉換。 – 2012-04-25 07:28:23

+0

是'reinterpret_cast '在這種情況下可以安全地在第一次投射到'IGraphBuilder **'後使用? – NtscCobalt 2012-04-25 21:34:46