将mem_fun_ref与boost :: shared_ptr一起使用

时间:2010-05-14 02:07:18

标签: c++ boost directx shared-ptr

根据this page的建议,我正在尝试让shared_ptr调用IUnknown::Release()而不是删除:

IDirectDrawSurface* dds;
... //Allocate dds
return shared_ptr<IDirectDrawSurface>(dds, mem_fun_ref(&IUnknown::Release));
  

错误C2784:'std :: const_mem_fun1_ref_t&lt; _Result,_Ty,_Arg&gt; std :: mem_fun_ref(_Result(__ thishisall _Ty :: *)(_ Arg)const)':无法从'ULONG(__ cdecl IUnknown :: *)中推断出'_Result(__thiscall _Ty :: *)(_ Arg)const'的模板参数(无效)'

     

错误C2784:'std :: const_mem_fun_ref_t&lt; _Result,_Ty&gt; std :: mem_fun_ref(_Result(__ thishisall_Ty :: *)(void)const)':无法从'ULONG(__ cdecl IUnknown :: *)中推断'_Result(__thiscall _Ty :: *)(void)const'的模板参数(无效)'

     

错误C2784:'std :: mem_fun1_ref_t&lt; _Result,_Ty,_Arg&gt; std :: mem_fun_ref(_Result(__ thishisall _Ty :: *)(_ Arg))':无法从'ULONG(__ cdecl IUnknown :: *)中推断'_Result(__thiscall _Ty :: *)(_ Arg)'的模板参数(void )'

     

错误C2784:'std :: mem_fun_ref_t&lt; _Result,_Ty&gt; std :: mem_fun_ref(_Result(__ thishisall_Ty :: *)(void))':无法从'ULONG(__ cdecl IUnknown :: *)中推断'_Result(__thiscall _Ty :: *)(void)'的模板参数(void )'

     

错误C2661:'boost :: shared_ptr :: shared_ptr':没有重载函数需要2个参数

我不知道该怎么做。我有限的模板/函子知识让我尝试了

typedef ULONG (IUnknown::*releaseSignature)(void);
shared_ptr<IDirectDrawSurface>(dds, mem_fun_ref(static_cast<releaseSignature>(&IUnknown::Release)));

但无济于事。有什么想法吗?

3 个答案:

答案 0 :(得分:6)

std::mem_fun_ref不支持stdcall调用转换以及可用于指针的std::mem_fun

您可以使用boost::mem_fn代替。您should define BOOST_MEM_FN_ENABLE_STDCALL使用COM方法。

shared_ptr<IDirectDrawSurface>( dds, boost::mem_fn(&IUnknown::Release) );

由于您的对象具有内部引用计数,因此您可以考虑使用boost::intrusive_ptr

答案 1 :(得分:3)

我知道这可能不是你想要的,只是包含ATLBase.h然后使用CComPtr模板。

然后你只需使用

 CComPtr< IDirect3DSurface9 > surf;
 pDevice->GetBackBuffer( 0, 0, D3DBACKBUFFER_TYPE_MONO, &surf );

然后,您可以将其复制到另一个CComPtr,它会为您处理所有AddRef和Releases。非常有用的模板类。

答案 2 :(得分:2)

调用约定说明符不是问题吗?这样可以吗?

void iUnk_delete(IUnknown* u) {
  u->Release();
}


return shared_ptr<IDirectDrawSurface>(dds, iUnk_delete);