2012-04-24 43 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

相关问题