Tôi đang cố gắng sử dụng std :: unique_ptrs để quản lý Windows HANDLE theo cách ngoại lệ.Sử dụng std :: unique_ptr cho Windows HANDLEs
Đầu tiên tôi đã cố gắng:
struct HandleDeleter
{
void operator()(HANDLE handle)
{
if(handle)
{
FindVolumeClose(handle)
}
}
}
typedef std::unique_ptr< HANDLE, HandleDeleter > unique_vol_handle_t;
Sau đó trong mã của tôi khi tôi cố gắng sử dụng nó:
unique_vol_handle_t volH(FindFirstVolumeW(buffer, MAX_GUID_PATH));
tôi nhận được lỗi sau từ 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
tham chiếu đến đường khai báo volH, ngay phía trên.
Sau khi tìm kiếm một thời gian, tôi thấy a blog article mà về cơ bản nói thêm:
typedef HANDLE pointer;
để phía trên cùng của tờ khai struct, và tất cả sẽ tốt.
Tôi không tin, nhưng tôi đã thử và nó đã giải quyết được lỗi. Tôi đang bối rối như thế nào xác định một loại (thậm chí không tham khảo nó) có thể làm cho một sự khác biệt như vậy.
Hai câu hỏi:
1) Bạn có thể giải thích lỗi gốc không? Tôi không hiểu tại sao trình biên dịch lại đề cập đến std::nullptr_t/nullptr
.
2) Làm cách nào để typedef giải quyết vấn đề này (hoặc ít nhất là xuất hiện)? Có một giải pháp ít 'ma quái ở một khoảng cách' cho điều này?
[Câu hỏi này] (http://stackoverflow.com/questions/12066721/what-are- sử dụng-of-the-type-stdnullptr-t). có thể giúp bạn tự hỏi về 'nullptr_t'. –
Cảm ơn, Joachim. Điều đó giúp với các thông điệp nullptr. – U007D
+1 để tham khảo cơ học lượng tử – Jon