Использование Qt: Неверное преобразование из const void * в void * при использовании QList <Type * const> - PullRequest
0 голосов
/ 02 сентября 2011

Я некоторое время возился с Qt и C ++, но столкнулся с этой ошибкой и, похоже, не могу понять, почему она возникает.Есть много других вопросов, на которые есть ответ с сообщением об ошибке преобразования const void *, но я не могу понять, как объяснения помогают в моем случае, поэтому вот так:

У меня естьпереопределение MyTypeManager из QList , так что список константных указателей на неконстантные MyTypes.Однако, когда функция в моей повторной реализации, addMyType вызывается

void MyTypeManager::addMyType(MyType *const var)
{
     this->append(var);
}

, возникают следующие ошибки:

In file included from /usr/include/qt4/QtCore/QList:1:0,
             from ../qtsdlthread/mytypemanager.h:4,
             from ../qtsdlthread/mytypemanager.cpp:1:
/usr/include/qt4/QtCore/qlist.h: In member function ‘void QList<T>::node_construct(QList<T>::Node*, const T&) [with T = MyType* const]’:
/usr/include/qt4/QtCore/qlist.h:499:13:   instantiated from ‘void QList<T>::append(const T&) [with T = MyType* const]’
../qtsdlthread/mytypemanager.cpp:20:26:   instantiated from here
/usr/include/qt4/QtCore/qlist.h:359:58: error: invalid conversion from ‘const void*’ to ‘void*’
/usr/include/qt4/QtCore/qlist.h: In member function ‘void QList<T>::node_copy(QList<T>::Node*, QList<T>::Node*, QList<T>::Node*) [with T = MyType* const]’:
/usr/include/qt4/QtCore/qlist.h:666:9:   instantiated from ‘QList<T>::Node* QList<T>::detach_helper_grow(int, int) [with T = MyType* const]’
/usr/include/qt4/QtCore/qlist.h:497:48:   instantiated from ‘void QList<T>::append(const T&) [with T = MyType* const]’
../qtsdlthread/mytypemanager.cpp:20:26:   instantiated from here
/usr/include/qt4/QtCore/qlist.h:386:17: error: invalid conversion from ‘const void*’ to ‘void*’

20: 26 в mytypemanager это строка this-> appendразмещено выше.

1 Ответ

4 голосов
/ 02 сентября 2011

Из документации :

Тип значения QList должен быть назначаемым типом данных.

Увы MyType *const не присваивается. У вас есть несколько лекарств:

1. Сделать T изменяемый указатель

2. Сделайте T указатель на ваш константный указатель:

typedef MyType *const Element

void MyTypeManager::addMyType(Element var)
{
    Element* ptr2ptr = new Element(var);
    this->append(ptr2ptr);
}

Но теперь у вас есть 2 уровня управления памятью для беспокойства.

3. (Опасно) Сделать T=MyType* и const-cast MyType *const в MyType *:

this->append(const_cast<MyType *>(var));

Это будет работать, только если вы уверены, что var изначально был создан как переменная MyType*.

...