根据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)));
但无济于事。有什么想法吗?
答案 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);