piro1107
@piro1107
Студент

Почему discards qualifiers?

Пишу модель, унаследованную от абстрактной QAbatractTableModel. Всё по феншую, методы, все, что надо переписал. Но решил я кэшировать данные в свойстве cache. Следовательно надо менять метод data и setData. В итоге получилось:
QVariant MyModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid()) return QVariant();

    if (!cache.contains(m_course)) {
        QMap<QDate, Week> weeks;
        Week week;
        QVector<ScheduleItemPrintable> day;
        for (int nDay = 0; nDay < 7; ++nDay) {
            for (int nDoublePeriod = 0; nDoublePeriod < 6; ++nDoublePeriod)
                day << ScheduleItemPrintable();
            week << day;
        }
        weeks.insert(m_monday, week);
        cache.insert(m_course, weeks); // ошибка
    }
    //...
}

Интерфейс класса модели:
class MyModel : public QAbstractTableModel
{
    Q_OBJECT
private:
    QStringList hheader;

    typedef QVector<QVector<ScheduleItemPrintable> > Week;
    QMap<QString, QMap<QDate, Week> > cache;

    QString m_course;
    QDate m_monday;
public:
    explicit MyModel(QObject *parent = 0);

    int rowCount(const QModelIndex &parent) const;
    int columnCount(const QModelIndex &parent) const;
    Qt::ItemFlags flags(const QModelIndex &index) const;
    QVariant headerData(int section, Qt::Orientation orientation, int role) const;
    bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role);
    QVariant data(const QModelIndex &index, int role) const;
    bool setData(const QModelIndex &index, const QVariant &value, int role);
};

В помеченном месте в первом листинге возникает ошибка:
error: passing 
'const QMap<QString, QMap<QDate, QVector<QVector<ScheduleItemPrintable> > > >'
as 'this' argument of 'QMap<Key, T>::iterator QMap<Key, T>::insert(const Key&, const T&) 
[with Key = QString; T = QMap<QDate, QVector<QVector<ScheduleItemPrintable> > >]' 
discards qualifiers [-fpermissive] cache.insert(m_course, weeks);


Вот и не пойму. Вроде бы всё законно. Свойство лежит в объекте и доступ из методов есть. Что не так?
P. S.: проблема решена с указателем на кэш, но всё же интересно, почему простым объектом не обойтись?
  • Вопрос задан
  • 5003 просмотра
Решения вопроса 2
@MiiNiPaa
Если нужен кеш в объекте, его можно пометить как mutable
Ответ написан
gbg
@gbg Куратор тега C++
Любые ответы на любые вопросы
Все честно - у вас константный метод намеревается слазить в поле класса и поменять его! Произвол! И да, ваш костыль с указателем - ни в какие ворота.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы