2013-11-16 4 views
1

Я не могу понять, что случилось с этой части кода:Изменение состояния структуры, хранящейся в QVector

struct aliance { 

    ... 

    void setFirstTeam(const team& _team) { 
     firstTeam = _team; 
    } 

    void setSecondTeam(const team& _team) { 
     secondTeam = _team; 
    } 

}  

QVector<aliance> _aliances; 

...  

_aliances.at(i).setFirstTeam(firstAlianceTeam); 
_aliances.at(i).setSecondTeam(secondAlianceTeam); 

я получаю ошибки:

passing 'const aliance' as 'this' argument of 'void aliance::setFirstTeam(const team&)' discards qualifiers [-fpermissive] 
passing 'const aliance' as 'this' argument of 'void aliance::setSecondTeam(const team&)' discards qualifiers [-fpermissive] 

Я уже повторен по крайней мере, все варианты этих двух функций с const и без него.

ответ

3

QVector<T>::at() возвращает const T&, что означает, что вы не можете вызывать неконстантные функции-члены на результат (например, функцию setFirstTeam()). Почему Qt не обеспечивает неконстантную перегрузку: вне меня, связанный с семантикой Qt для копирования на запись для своих контейнеров (благодаря @peppe для указания этого). Это обеспечит как перегруженные для operator[], так что вы просто должны сделать это вместо того, чтобы:

_aliances[i].setFirstTeam(firstAlianceTeam); 
+2

Поскольку 'at' предназначен для предотвращения отсоединения, и это делает очевидным, что вы не прикасаясь содержимое контейнера. 'operator []' имеет вместо const перегрузки. Другими словами: 'vector.at (i) .constMethod()' будет стоить полную копию вектора, если вектор не был объявлен const. – peppe

+0

@peppe О, право. Я забыл о семантике Qt для записи на контейнеры. – Angew