我写了这样的话:
class Storage
{
public:
Storage();
QString key() const;
int value() const;
void add_item(QString&,int);
private:
QMap<QString,int>* my_map_;
};
void Storage::add_item(QString& key,int value)//------HERE IS THE SLOT FOR ADDING
{
*my_map_[key] = value;
}
当我尝试将项目添加到QMap
时:
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget* = 0);
public slots:
void add_item()
{
strg_->add_item(ui->lineEdit->text(),ui->spinBox->value());//---HERE I'M "PASSING" TWO OBJECTS: QString AND int
ui->lineEdit->clear();
}
private:
Ui::Dialog* ui;
Storage* strg_;
};
我收到错误:
error: no matching function for call to 'Storage::add_item(QString, int)
note: candidates are: void Storage::add_item(QString&, int)
我如何通过ref发送QString
。其他然后我现在这样做?
谢谢。
答案 0 :(得分:10)
add_item应该采用“const QString&amp;”而不是“QString&amp;”作为参数。
答案 1 :(得分:2)
此行按值
返回QStringui->lineEdit->text(),ui->spinBox->value()
因此,您不能将其用作可修改的参考。但是,您可以将其用作不可修改的(const)引用,方法是将add_item函数修改为const QString&
。
void Storage::add_item(const QString& key,int value)
{
*my_map_[key] = value;
}
此外,根据QString的实现,通过值传递它可能同样有效:
void Storage::add_item(QString key,int value)
{
*my_map_[key] = value;
}
...但请注意,通常使用类,在可能的情况下使用const引用会更有效。
答案 2 :(得分:0)
问题是ui->lineEdit->text()
似乎返回QString
而不是QString&
。
您不能通过引用add_item
函数来传递它,因为它在任何地方都不存在,它只是该函数返回的临时副本。如果你在堆栈上声明它然后像下面那样传递它,它应该工作:
QString qs = ui->lineEdit->text();
strg_->add_item(qs,ui->spinBox->value());