2

按照这个页面的建议,我试图让 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<_Result,_Ty,_Arg> std::mem_fun_ref(_Result (__thiscall _Ty::* )(_Arg) const)' : 无法推断出 '_Result (__thiscall _Ty::* ) 的模板参数(_Arg) const' 来自 'ULONG (__cdecl IUnknown::* )(void)'

错误 C2784: 'std::const_mem_fun_ref_t<_Result,_Ty> std::mem_fun_ref(_Result (__thiscall _Ty::* )(void) const)' : 无法推导出 '_Result (__thiscall _Ty::* )(void ) const' 来自 'ULONG (__cdecl IUnknown::* )(void)'

错误 C2784: 'std::mem_fun1_ref_t<_Result,_Ty,_Arg> std::mem_fun_ref(_Result (__thiscall _Ty::* )(_Arg))' : 无法推断出 '_Result (__thiscall _Ty::* )的模板参数( _Arg)' 来自 'ULONG (__cdecl IUnknown::* )(void)'

错误 C2784: 'std::mem_fun_ref_t<_Result,_Ty> std::mem_fun_ref(_Result (__thiscall _Ty::* )(void))' : 无法推断出 '_Result (__thiscall _Ty::* )(void) 的模板参数'来自'ULONG (__cdecl IUnknown::*)(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)));

但无济于事。有任何想法吗?

4

3 回答 3

6

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

你可以boost::mem_fn改用。您应该定义 BOOST_MEM_FN_ENABLE_STDCALL使用 COM 方法。

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

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

于 2010-05-14T04:06:26.813 回答
3

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

然后你只需使用

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

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

于 2010-05-14T07:29:06.563 回答
2

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

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


return shared_ptr<IDirectDrawSurface>(dds, iUnk_delete);
于 2010-05-14T02:11:55.530 回答