Подтвердить что ты не робот

Reinterpret_cast отбрасывает квалификаторы

Я добавляю проблему при переинтерпретации переменной, и я не знаю, почему..

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 кажется недопустимым и говорит

reinterpret_cast от 'const void *) до Dialog * отбрасывает квалификаторы

Любая идея

4b9b3361

Ответ 1

Как сказал Ник Струпат в комментарии,

reinterpret_cast не может отбрасывать cv-квалификаторы

Таким образом, вы можете использовать reinterpret_cast и const_cast вместе.

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

Ответ 2

Вам нужно также использовать const_cast для удаления квалификаторов const. Кроме того, кастинг из void * может использовать static_cast, ему не нужно переинтерпретировать. Например:

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

Однако убедитесь, что Диалог на самом деле не является объектом const; попытка изменить объект const (предположительно setValue делает это) вызывает поведение undefined.

Я бы предложил переосмыслить интерфейс на ProgressBar, чтобы избежать необходимости приведения в действие.