2015-01-17 13 views
19

dodam problem na reinterpretacji zmienną i nie wiem dlaczego ..reinterpret_cast rzuca dala kwalifikatorów

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); 
} 

reinterpret_cast nie wydaje się dozwolone i powiedzieć

reinterpret_cast z „const void *), aby Dialog * odlewy z dala kwalifikatorów

Każdy pomysł

+3

'reinterpret_cast' nie może odrzucić kwalifikatorów cv –

+0

Wypróbuj' Dialog const * const dialog = reinterpret_cast

(data); ' –

+0

@Nick: Ostatnia' const', którą umieściłeś nie ma efekt. –

Odpowiedz

24

Jak Nick Strupat stwierdził w komentarzu,

reinterpret_cast nie można wyrzucać CV kwalifikatorów

Więc można użyć reinterpret_cast i const_cast razem.

Dialog *dialog = const_cast<Dialog*>(reinterpret_cast<const Dialog *>(data)); 
+0

Czy nie brakuje ci const na najbardziej wewnętrznym typie Dialog *? –

+0

@BradSpencer Zmieniono to, dzięki. –

6

Trzeba też użyć const_cast usunąć const kwalifikatorów. Ponadto, odlewanie z void * może używać static_cast, nie ma potrzeby ponownego interpretowania. Na przykład:

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

Jednak upewnić się, że Dialog nie jest faktycznie const przedmiot; próba modyfikacji obiektu const (prawdopodobnie robi to setValue) powoduje niezdefiniowane zachowanie.

Sugeruję ponowne przemyślenie interfejsu na ProgressBar, aby uniknąć potrzeby użycia tej obsady.

Powiązane problemy