【问题标题】:Problem when attempting to change the value of a two-dimensional vector尝试更改二维向量的值时出现问题
【发布时间】:2023-03-03 04:09:01
【问题描述】:

我正在尝试更改二维 QVector (QVector<QVector<QString>) 的值。但是,在尝试时,我收到以下错误:passing 'const QString' as 'this' argument discards qualifiers [-fpermissive]

我首先认为问题出在我访问QVector 中的数据的方式上。因此,我尝试通过operator [] 访问它。这给了我以下错误:no match for 'operator=' (operand types are 'QVector<QString>' and 'QString')。我还尝试取消引用向量 (*SecondList),因为我不确定 operator [] 是否这样做并得到以下错误:no match for 'operator*' (operand type is 'const QVector<QString>')

这是有问题的代码:

void Handler::changePassword(QString newPassword, int id)
{
    
    QString nP = newPassword;

    int i = 0;
    bool loopBreaker = false;

    while (!loopBreaker)    
    {
        if (SecondList->at(i).at(2) == QString::number(id))
        {//Changes the value for password in "secondlist"
            SecondList->at(i).at(0) = nP;    // ----> ERROR
            loopBreaker = true;
            saveList();
        }
        i++;
    }
}

这是Handler 类的头文件

class Handler : public QWidget
{
private: 
    QVector<QVector<QString>> *SecondList = new QVector<QVector<QString>>;
}

(为了便于阅读,省略了代码)

【问题讨论】:

  • 你真的需要动态分配你的QVector吗?我会将QVector&lt;QVector&lt;QString&gt;&gt; *SecondList = new QVector&lt;QVector&lt;QString&gt;&gt;; 更改为QVector&lt;QVector&lt;QString&gt;&gt; SecondList;
  • 是的,这会更好。我将在没有动态分配的情况下进行测试,看看它是否解决了问题。
  • 是的,最好是记住,如果你使用QVector&lt;QVector&lt;QString&gt;&gt; SecondList;,vector的元素仍然是动态分配的
  • 我正在测试它,回复你

标签: c++ qt qvector


【解决方案1】:

所以 Ben 通过here 回答了这个问题

但原因是QVector::at方法是const,完整原型是const T &amp;QVector::at(int i) const

所以你将不得不使用QVector::operator[],完整原型是T &amp;QVector::operator[](int i)

所以我会尝试SecondList-&gt;operator[](i).operator[](0) = nP;。类似的东西。

【讨论】:

  • 但是你为什么要手动调用operator[] 而不是按原意使用[i]
  • 这部分是问题所在,但*SecondList[i][2] = nP; 也不起作用。正如@MaxLanghof 指出的那样,我刚刚忘记了*SecondList 周围的括号
【解决方案2】:

QVector at() 返回一个 const T&,尝试改用 operator [],它返回 non-const &

【讨论】:

  • 我试过*SecondList[i][2] = nP;,但我得到这个错误:no match for 'operator*' (operand type is 'QVector&lt;QString&gt;')。正如@drescherjm 建议的那样,这可能是因为我的向量是一个指针,而不是内部的。
  • 尝试不带前导 *,即只做 SecondList[i][2] = nP 。 * 是取消引用运算符。
  • @WKstraw 你必须这样做(*SecondList)[i][2]
  • 这是我最初的想法,但后来我得到了这个错误:no match for 'operator=' (operand types are 'QVector&lt;QString&gt;' and 'QString')
  • @David 这不正确。对于两个嵌套向量,您已经需要两个索引操作。从技术上讲,SecondList[0][i][2] 是可行的(因为x[y] 对于原始指针来说实际上是*(x+y)),但请不要这样做。
猜你喜欢
  • 2023-04-10
  • 1970-01-01
  • 2021-10-28
  • 2022-07-13
  • 2013-11-30
  • 2019-12-26
  • 1970-01-01
  • 1970-01-01
  • 2023-01-23
相关资源
最近更新 更多