我正在尝试使用 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 是如何解决这个问题的(或者至少看起来是这样的)?对此是否有一个不那么“幽灵般的远距离行动”解决方案?