6

std :: shared_ptrを使用していて、カスタムデリータが必要な場合、通常、オブジェクトのメンバー関数を作成して、次のようにオブジェクトの破棄を容易にします。

class Example
{
public:
    Destroy();
};

そして、共有ptrを使用するときは、次のようにします。

std::shared_ptr<Example> ptr(new Example, std::mem_fun(&Example::Destroy));

問題は、現在d3d11を使用していて、comリリース関数をstd::shared_ptrカスタム削除機能として使用したいということです。

std::shared_ptr<ID3D11Device> ptr(nullptr, std::mem_fun(&ID3D11Device::Release));

しかし、私はこのエラーを受け取ります:

error C2784: 'std::const_mem_fun1_t<_Result,_Ty,_Arg> std::mem_fun(_Result (__thiscall _Ty::* )(_Arg) const)' : could not deduce template argument for '_Result (__thiscall _Ty::* )(_Arg) const' from 'ULONG (__stdcall IUnknown::* )(void)'

次に、次のようにテンプレートパラメータを明示的に指定すると、次のようになります。

std::shared_ptr<ID3D11Device> ptr(nullptr, std::mem_fun<ULONG, ID3D11Device>(&ID3D11Device::Release));

このエラーが発生します、

error C2665: 'std::mem_fun' : none of the 2 overloads could convert all the argument types

この関数を削除機能として使用できない理由を誰かが説明できますか?

注:CComPtrを使用することをお勧めしません。msvc++expressエディションを使用しています:\

4

2 に答える 2

16

これはどう?

std::shared_ptr<ID3D11Device> ptr(nullptr, [](ID3D11Device* ptr){ptr->Release();} ); 
于 2012-11-29T20:35:52.693 に答える
1

これを試して

struct Releaser{
    void operator()(ID3D11Device* p){
        p->Release();

    };

};


std::shared_ptr<ID3D11Device> ptr(nullptr, Releaser());
于 2012-11-29T20:18:18.967 に答える