Ho c-Structure che voglio incorporare in una classe cpp senza avvelenare il mio spazio dei nomi globale, quindi non voglio includere il c-header.QScopedPointer, boost :: scoped_ptr - perché lamentarsi di tipi incompleti?
Ecco perché voglio utilizzare un puntatore a scope intelligente (QScopedPointer
o boost::scoped_ptr
) con un nome di struttura dichiarata in avanti.
Quello che non capisco è l'implementazione di entrambi menzionato puntatori di ambito che cade sulla compilazione:
spinta:
errore C2027: uso di tipo non definito '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;
}
e lo stesso in Qt:
errore C2027: uso di tipo non definito '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;
}
};
La documentazione fa riferimento non mi ha aiutato. dice che il distruttore della classe dichiarata avanti non deve essere in linea e deve essere disponibile ad ogni possibile istanziazione della pulizia del puntatore ad ambito. Ma la mia struttura c non ha un distruttore.
Così ho 2 domande:
- Perché questo controllo a tutti? Perché sembra irrilevante sapere la dimensione per chiamare delete.
- Come affrontare questo?
ah ho trascurato la piccola linea con la definizione del distruttore virtuale vuoto nel corpo delle dichiarazioni di classe. dopo averlo spostato nel cpp l'errore era sparito. –