【问题标题】:Change in the state of a struct stored in a QVector存储在 QVector 中的结构的状态变化
【发布时间】:2013-11-16 12:20:09
【问题描述】:

我不明白这部分代码有什么问题:

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 至少重试了这两个函数的所有变体,而没有一个。

【问题讨论】:

    标签: c++ qt vector struct qvector


    【解决方案1】:

    QVector&lt;T&gt;::at() 返回一个const T&amp;,这意味着您不能对结果调用非常量成员函数(例如您的setFirstTeam() 函数)。为什么 Qt 不提供非常量重载 beyond me 与 Qt 的容器写入时复制语义有关(感谢 @peppe 指出这一点)。它确实为operator[] 提供了两个重载,所以你应该这样做:

    _aliances[i].setFirstTeam(firstAlianceTeam);
    

    【讨论】:

    • 因为at 旨在避免分离,并且很明显您没有接触容器的内容。 operator[] 有 const 重载。换句话说:vector.at(i).constMethod() 如果向量未声明为 const,则将花费向量的完整副本。
    • @peppe 哦,对。我忘记了 Qt 的容器写时复制语义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2018-12-17
    • 1970-01-01
    相关资源
    最近更新 更多