#c #qt
Вопрос:
У меня есть эти занятия:
class IParameter {}; class ModuleParameter : public IParameter {};
Теперь у меня есть QList производных:
QListlt;ModuleParameter*gt; list;
Когда я бросаю один предмет, все в порядке:
IParameter *p = list[0]; // ok
Когда я составляю список, у меня возникает ошибка.
QListlt;IParameter*gt; *list = static_castlt;QListlt;IParameter*gt;*gt;(amp;list);
Invalid static_cast from type QListlt;ModuleParameter*gt;* to type QListlt;IParameter*gt;*
.
Итак, как я могу бросить?
Комментарии:
1. рассмотрим std::копирование или std::преобразование
Ответ №1:
Если вам действительно нужен QListlt;IParameter*gt;, вы можете сделать что-то вроде этого:
QListlt;A*gt; la; QListlt;B*gt; lb; ... std::transform(lb.cbegin(), lb.cend(), std::back_inserter(la), [=](B* b) { return static_castlt;A*gt;(b); });
Комментарии:
1. Этот код создает копию, но возможен ли кастинг?
2. Нет, как и сказал Свифт,
QListlt;A*gt;
иQListlt;B*gt;
это два разных типа.3. @maestro casting также создает копию. Приведение указателя небезопасно, и допускается только переосмысление).
4. Они рефакторировали QList в последних версиях Qt? раньше в нем не было cbegin/cend, но было перегружено начало/конец и некоторые проблемы с итерацией.
Ответ №2:
QList
является шаблоном без общего базового типа класса и QListlt;ModuleParameter*gt;
не имеет отношения к QListlt;IParameter*gt;
типу , к которому вы не можете QListlt;ModuleParameter*gt;
получить полиморфный доступ с помощью указателя QListlt;IParameter*gt;
. То, что вы пытаетесь сделать, невозможно сделать таким образом.
Вместо этого вы можете хранить указатели на ModuleParameter
in QListlt;IParameter*gt;
и использовать приведение при доступе к ним.
Комментарии:
1. Итак, все ли, что вы изложили, подходит для любого класса шаблонов?
2. @maestro Это для любого типа. Тип, созданный шаблоном с уникальным набором аргументов шаблона, является уникальным типом (сам шаблон не является типом). можно создать шаблон, который был бы статически или динамически полиморфным, но для этого требуется наследование, а QList-это не так.