这是我的类构造函数:
UndoRedo::UndoRedo(QList<vector_t*> v,
QUndoCommand *parent)
: QUndoCommand(parent)
{
...
QStringList *sl = &v[0][0];
...
}
vector_t
typedef QVector<QStringList> vector_t ;
当我尝试以这种方式设置“sl”时,IDE会引发此错误:
no match for ‘operator*’ (operand type is ‘QList<QVector<QStringList>*>’)
我做错了什么?你能救我吗?
答案 0 :(得分:4)
我在你的问题中看到的最大问题是你似乎过于复杂的简单事情。首先,Qt的容器是隐式共享的。因此,如果不修改所述副本,则获取它们的副本是便宜的。因此,您可以通过引用自由地传递最外面的容器,并按值获取内部。
例如,将QList<vector_t>
简单地传递给您的方法,相当便宜。它不涉及任何形式的复制。即使这样,传递const引用而不是值const QList<vector_t> &
也会花费少一点。
你为什么要取v
的地址?让我们剖析v
:
QList<vector_t*> = QList<QVector<QStringList>>*>
要访问您需要的最内层元素:
v[0]
*exp
exp[0]
按exp
我的意思是前面的表达式,作为一个单元。
因此:
QStringList & sl = (*(v[0]))[0];
这是C ++,而不是C,你应该使用引用而不是指针。
如果你坚持使用指针:
QStringList * sl = *((*(v[0]))[0]);
但是你可以做一些愚蠢的事情,比如delete sl
或free(sl)
,它会编译,但会导致你的硬盘被格式化。