Tôi có cấu trúc c mà tôi muốn nhúng vào một lớp cpp mà không bị nhiễm độc vùng tên chung của tôi vì vậy tôi không muốn bao gồm tiêu đề c.QScopedPointer, boost :: scoped_ptr - tại sao phàn nàn về các loại không đầy đủ?
Đó là lý do tại sao tôi muốn sử dụng con trỏ có phạm vi thông minh (QScopedPointer
hoặc boost::scoped_ptr
) với tên cấu trúc được khai báo chuyển tiếp.
Những gì tôi không hiểu là việc thực hiện của cả hai đề cập con trỏ chỉnh phạm vi mà không thành công trên biên dịch:
tăng:
lỗi C2027: sử dụng các loại không xác định 'xxx'
template<class T> inline void checked_delete(T * x)
{
// intentionally complex - simplification causes regressions
typedef char type_must_be_complete[ sizeof(T)? 1: -1 ]; // < here
(void) sizeof(type_must_be_complete);
delete x;
}
và giống nhau trong Qt:
lỗi C2027: sử dụng các loại không xác định 'xxx'
template <typename T>
struct QScopedPointerDeleter
{
static inline void cleanup(T *pointer)
{
// Enforce a complete type.
// If you get a compile error here, read the section on forward declared
// classes in the QScopedPointer documentation.
typedef char IsIncompleteType[ sizeof(T) ? 1 : -1 ]; // < here
(void) sizeof(IsIncompleteType);
delete pointer;
}
};
Các tài liệu tham khảo không giúp tôi. nó nói rằng destructor của lớp được khai báo phía trước không phải là inline và phải có sẵn ở mọi khả năng instantiation của cleanup của scoped pointer. Nhưng c-cấu trúc của tôi không có một destructor.
Vì vậy, tôi có 2 câu hỏi:
- Tại sao việc kiểm tra này ở tất cả? Bởi vì có vẻ như không liên quan đến việc biết kích thước để gọi xóa.
- Làm cách nào để giải quyết vấn đề này?
ah tôi đã bỏ qua dòng nhỏ với định nghĩa phá hủy ảo trống trong phần khai báo lớp. sau khi chuyển nó sang cpp, lỗi đã biến mất. –