Похоже, что QList
предназначен для использования с не указателями. Они определяют большую часть интерфейса, который является const как const T&
, который прекрасно работал бы, если бы ваш QList
был на Child
, а не Child*
.
Он будет отлично работать с указателями, но не может объявить константность для них. Я не рекомендую изменять ваш QList на Child, если только его копирование не обходится дешево, у вас есть вся правильная семантика для copy ctor, dtor, op=, op== и т. д., и вы не против иметь копии в списке, а не в объекты, которые вы передаете. Вы можете видеть, как с int
или строками это будет работать так, как ожидалось (removeAll будет правильным const).
Если для вас важна корректность const, используйте const_cast. Затем объявите константную ссылку и передайте ее.
void Parent::removeChild(const Child *child)
{
QList<Child*>::const_reference constRefToChild = const_cast<Child *> child;
children.removeAll(constRefToChild);
}
Дело в том, что если removeAll когда-либо изменится, чтобы не принимать константу, вы получите ошибку компилятора. Тогда вы бы знали, что removeAll не сохраняет константность аргумента.
person
Lou Franco
schedule
03.09.2010
const Child *
илиChild * const
? Когда вы говорите, что константная ссылка на неконстантный указатель, вы имеете в видуChild * const &
или что-то еще? Существует неотъемлемая двусмысленность, потому что указатель const строго означаетT * const
, но при случайном использовании может означатьconst T *
. - person Philip Potter   schedule 01.09.2010removeAll()
принимает «константную ссылку на указатель на неконстантный дочерний элемент». Я всегда забываю, какой синтаксис какой. Так что я говорю, очевидно, не о самом значении указателя, а об объекте, на который указывает, дочернем элементе. - person Emil Eriksson   schedule 01.09.2010children
был объявлен какQList<Child *>
или что-то в этом роде, и это важно. Показ фактического объявленияchildren
позволил бы избежать путаницы. - person David Thornley   schedule 03.09.2010