Suivant les conseils de cette page , j’essaie de faire en sorte que shared_ptr appelle IUnknown :: Release () au lieu de delete:
IDirectDrawSurface* dds; ... //Allocate dds return shared_ptr(dds, mem_fun_ref(&IUnknown::Release));
erreur C2784: ‘std :: const_mem_fun1_ref_t std :: mem_fun_ref (_Result (__thiscall _Ty :: *) (_ Arg) const)’: impossible de déduire l’argument modèle pour ‘_Result (__thiscall _Ty *) (_Arg) const ‘de’ ULONG (__cdecl IUnknown :: *) (void) ‘
erreur C2784: ‘std :: const_mem_fun_ref_t std :: mem_fun_ref (_Result (__thiscall _Ty :: *) (void) const’ ‘: impossible de déduire l’argument de modèle pour’ _Result (__thiscall _Ty :: * (void) ) const ‘from’ ULONG (__cdecl IUnknown :: *) (void) ‘
erreur C2784: ‘std :: mem_fun1_ref_t std :: mem_fun_ref (_Result (__thiscall _Ty :: *) (_ Arg))’: impossible de déduire l’argument de modèle pour ‘_Result (__thiscall _Ty :: *)’ _Arg) ‘de’ ULONG (__cdecl IUnknown :: *) (void) ‘
- c ++ Boost asio error: pas de chiffrement partagé
- utiliser plusieurs instances de mémoire partagée à la fois
- Erreurs liées au lieur avec Boost sur Mac (OSX 10.10.02 | Xcode 6.1.1)
- boost :: serialization: un object avec un constructeur privé par défaut fonctionne dans un vecteur, mais pas dans une carte
- Augmenter la valeur du jeton d’écriture de l’esprit lex dans le stream d’entrée
erreur C2784: ‘std :: mem_fun_ref_t std :: mem_fun_ref (_Result (__thiscall _Ty :: *) (void))’: impossible de déduire l’argument de modèle pour ‘_Result (__thiscall _Ty :: *) (void) ‘from’ ULONG (__cdecl IUnknown :: *) (void) ‘
erreur C2661: ‘boost :: shared_ptr :: shared_ptr’: aucune fonction surchargée ne prend 2 arguments
Je ne sais pas quoi faire de cela. Ma connaissance limitée du template / foncteur m’a amené à essayer
typedef ULONG (IUnknown::*releaseSignature)(void); shared_ptr(dds, mem_fun_ref(static_cast(&IUnknown::Release)));
Mais en vain. Des idées?
Le spécificateur de convention d’appel n’est-il pas un problème? Est-ce que ça va?
void iUnk_delete(IUnknown* u) { u->Release(); } return shared_ptr(dds, iUnk_delete);
std::mem_fun_ref
ne prend pas en charge la conversion d’appel stdcall
std::mem_fun
que vous pouvez utiliser pour les pointeurs.
Vous pouvez utiliser boost::mem_fn
place. Vous devez définir BOOST_MEM_FN_ENABLE_STDCALL
pour travailler avec les méthodes COM.
shared_ptr( dds, boost::mem_fn(&IUnknown::Release) );
Et puisque votre object possède le nombre de références internes, vous pouvez utiliser plutôt boost::intrusive_ptr
.
Je sais que ce n’est peut-être pas ce que vous voulez, mais incluez simplement ATLBase.h et utilisez ensuite le modèle CComPtr.
Vous utilisez alors juste
CComPtr< IDirect3DSurface9 > surf; pDevice->GetBackBuffer( 0, 0, D3DBACKBUFFER_TYPE_MONO, &surf );
Vous pouvez ensuite le copier sur un autre CComPtr et il gérera pour vous tous les AddRefs et communiqués. Classe de template très utile.