Использование Qt: неверное преобразование из const void* в void* при использовании QList‹Type *const›

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

У меня есть повторная реализация MyTypeManager QList‹ MyType *const>, поэтому список константных указателей на неконстантные 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, опубликованная выше.


person mueslo    schedule 02.09.2011    source источник
comment
Есть ли веская причина, по которой вы должны использовать константные указатели?   -  person Emile Cormier    schedule 02.09.2011
comment
Я подумал, что было бы неплохо сделать их константными, так как они не должны изменяться только ради константной правильности.   -  person mueslo    schedule 02.09.2011
comment
Если не предполагается изменять сами объекты, то следует использовать MyType const * вместо MyType * const. QtList<MyType const *> должно работать.   -  person Emile Cormier    schedule 02.09.2011


Ответы (1)


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

Тип значения 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* и константно преобразовать MyType *const в MyType *:

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

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

person Emile Cormier    schedule 02.09.2011