La ragione principale è perché non v'è alcun requisito che un puntatore al membro hanno la stessa dimensione e rappresentazione come un puntatore a dati.
In pratica, è difficile immaginare un puntatore a un membro di dati che non può essere inserito in un
void*
, poiché un puntatore a un membro dati deve solo contenere uno scostamento . In parole povere, un puntatore a un membro di dati sarà mai più grande di uno
size_t
e un
void*
deve essere di dimensioni almeno pari a
size_t
. D'altra parte, potrebbe contenere facilmente modelli di bit che non erano legali in un puntatore.
Infatti, come sottolinea Steve Jessop, i puntatori ai membri richiedono informazioni aggiuntive, poiché se il membro si trova in una base virtuale, il suo offset dipende dalla classe più derivata e deve essere calcolato dinamicamente, in base a informazioni aggiuntive nel puntatore.
Più in generale, un void*
può contenere solo un puntatore ai dati. Deve essere grande come il più grande indicatore di dati (in genere un char*
), ma i puntatori a funzioni, e puntatori membri, può essere più grande, e non in forma (e puntatore a funzioni membro quasi mai andare bene).
fonte
2013-03-21 12:37:28
Qual è il messaggio di errore? –
"typedef struct abc abc;" Veramente? –
Sto utilizzando MSVC2012: errore C2440: 'tipo cast': impossibile convertire da 'char abc :: *' a 'void *' – Paul