web-dev-qa-db-fra.com

reinterpret_cast élimine les qualificatifs

J'ajoute un problème sur la réinterprétation d'une variable et je ne sais pas pourquoi ..

int ProgressBar(const uint64_t data_sent, const uint64_t data_total, void const * const data) {
    Dialog *dialog = reinterpret_cast<Dialog *>(data);
    dialog->setValue((data_sent * 100) / data_total);
}

le reinterpret_cast ne semble pas autorisé et dit

reinterpret_cast de 'const void *) vers Dialog * élimine les qualificatifs

Une idée

32
Seb

Comme Nick Strupat l'a déclaré dans un commentaire,

reinterpret_cast ne peut pas supprimer les qualificatifs cv

Vous pouvez donc utiliser reinterpret_cast et const_cast ensemble.

Dialog *dialog = const_cast<Dialog*>(reinterpret_cast<const Dialog *>(data));
38
Pranit Kothari

Vous devez également utiliser un const_cast pour supprimer les qualificatifs const. En outre, la diffusion de void * peut utiliser static_cast, il n'a pas besoin d'être réinterprété. Par exemple:

Dialog const *dialog = static_cast<Dialog const *>(data);
Dialog *d2 = const_cast<Dialog *>(dialog);

Cependant, assurez-vous que la boîte de dialogue n'est pas réellement un objet const; tenter de modifier un objet const (vraisemblablement setValue fait cela) provoque un comportement indéfini.

Je suggère de repenser l'interface à ProgressBar pour éviter d'avoir besoin de cette distribution.

6
M.M