Estoy intentando usar std :: unique_ptrs para administrar Windows HANDLEs de una manera segura.Uso de std :: unique_ptr para Windows HANDLEs
Primero intentó:
struct HandleDeleter
{
void operator()(HANDLE handle)
{
if(handle)
{
FindVolumeClose(handle)
}
}
}
typedef std::unique_ptr< HANDLE, HandleDeleter > unique_vol_handle_t;
Más adelante en mi código cuando trato de usarlo:
unique_vol_handle_t volH(FindFirstVolumeW(buffer, MAX_GUID_PATH));
me sale el siguiente error de Visual Studio 2012RC:
1> error C2664: 'std::unique_ptr<_Ty,_Dx>::unique_ptr(std::nullptr_t) throw()' : cannot convert parameter 1 from 'HANDLE' to 'std::nullptr_t'
1> with
1> [
1> _Ty=HANDLE,
1> _Dx=VolumeHandleDeleter
1> ]
1> nullptr can only be converted to pointer or handle types
haciendo referencia a la línea de declaración volH, inmediatamente arriba.
Después de buscar durante algún tiempo, encontré a blog article que básicamente dice, añadir:
typedef HANDLE pointer;
a la parte superior de la declaración struct, y todo estará bien.
No lo creía, pero lo probé y resolvió el error. Me sorprende cómo definir un tipo (sin siquiera hacer referencia a él) podría marcar una gran diferencia.
dos preguntas:
1) ¿Puede explicar el error original? No entiendo por qué el compilador se refiere al std::nullptr_t/nullptr
.
2) ¿Cómo es que el typedef resuelve esto (o al menos parece)? ¿Existe una solución menos "escalofriante de acción a distancia" para esto?
[Esta pregunta] (http://stackoverflow.com/questions/12066721/what-are- the-uses-of-the-type-stdnullptr-t). podría ayudar con su pregunta sobre 'nullptr_t'. –
Gracias, Joachim. Eso ayuda con los mensajes nullptr. – U007D
+1 para la referencia de mecánica cuántica – Jon