Я пытаюсь использовать std :: unique_ptrs для управления Windows HANDLE безопасным способом.
Сначала я попробовал:
struct HandleDeleter
{
void operator()( HANDLE handle )
{
if( handle )
{
FindVolumeClose( handle )
}
}
}
typedef std::unique_ptr< HANDLE, HandleDeleter > unique_vol_handle_t;
Позже в моем коде, когда я пытаюсь использовать его:
unique_vol_handle_t volH( FindFirstVolumeW( buffer, MAX_GUID_PATH ) );
Я получаю следующую ошибку от 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
ссылаясь на строку объявления volH, сразу выше.
После поиска в течение некоторого времени я нашел статью в блоге, в которой, в основном, сказано:
typedef HANDLE pointer;
к началу объявления структуры, и все будет хорошо.
Я не поверил, но я попробовал, и это действительно помогло исправить ошибку. Я озадачен тем, как определение типа (даже без ссылки на него) может иметь такое значение.
Два вопроса:
1) Можете ли вы объяснить оригинальную ошибку? Я не понимаю, почему компилятор ссылается на std::nullptr_t/nullptr
.
2) Как typedef разрешает это (или, по крайней мере, кажется)? Есть ли менее пугающее решение на расстоянии?