2

このページのアドバイスに従って、 shared_ptrにdeleteの代わりに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'from' 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'from' 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)'from' ULONG(__cdecl IUnknown :: *)(void) '

エラーC2784:'std :: mem_fun_ref_t <_Result、_Ty> std :: mem_fun_ref(_Result(__thiscall _Ty :: *)(void))':'_Result(__thiscall _Ty :: *)(void)のテンプレート引数を推測できませんでした'from' 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。COM メソッドで動作するように定義する必要がありますBOOST_MEM_FN_ENABLE_STDCALL

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にコピーすると、すべてのAddRefとリリースが処理されます。非常に便利なテンプレートクラス。

于 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 に答える