错误:从'QStringList'转换为请求的非标量类型'QString'

时间:2014-07-21 15:42:34

标签: c++ qt qtcore qlist qvector

这是我的班级:

// file .h
#ifndef UNDOREDO_H
#define UNDOREDO_H

#include <QUndoCommand>

typedef QVector<QStringList> vector_t ;

class UndoRedo : public QUndoCommand
 {
 public:
     UndoRedo(QList<vector_t> v,
                    QUndoCommand *parent = 0);

     void undo();
 private:    
     QList<vector_t> *cb_values;
 };

#endif // UNDOREDO_H
// file .cpp
#include "undoredo.h"

UndoRedo::UndoRedo(QList<vector_t> v,
                   QUndoCommand *parent)
    : QUndoCommand(parent)
{
    cb_values = &v;
}

void UndoRedo::undo() {    
    QString last = cb_values[0][0].takeLast();
    qDebug() << last << "removed!";
}

当我调用undo()方法时,IDE会引发此错误:

错误:从&#39; QStringList&#39;转换到非标量类型&#39; QString&#39;请求的

我在哪里做错了?

2 个答案:

答案 0 :(得分:2)

在构造函数中,您将获取在构造函数返回时将消失的参数的地址:

cb_values = &v;

这一行会编译,但这是荒谬的。一旦构造函数返回,存储在cb_values中的指针就会悬空,它的进一步使用可能会导致你的硬盘被格式化。

让我们分解cb_values[0][0].takeLast()

QList<vector_t> * cb_values
QList<vector_t> cb_values[0]
QVector<QStringList>=vector_t cb_values[0][0]
QStringList cb_values[0][0].takeLast()

因此,您的表达式类型为QStringList,但您尝试将其分配给QString。我不知道你真正想要实现的目标。也许是(*cb_values)[0][0].takeLast()

答案 1 :(得分:1)

cb_values是指向QList<vector_t>的指针,因此cb_values[0]QList<vector_t>。因此cb_values[0]vector_tQVector<QStringList>。然后,您在此向量上调用takeLast(),然后返回QStringList,您尝试将其分配给QString。在我看来,你正在调用takeLast()而不是你想要的对象。