如何传递const QString引用?

时间:2015-08-13 14:30:40

标签: c++11 parameter-passing qt5 pass-by-reference qt5.4

我有几个'标签',我想从这些标签中创建一个格式化的QString,例如:

void createFormattedPlainText(QString & refLine, const QString & v1, const QString & v2, const QString & v3)
{
  refLine.clear();
  refLine.append("[%0] :: [%1] ++ %2").arg(v1, v2, v3);
}

所以,我想打电话:

QString line;
createFormattedPlainText(line, "123", "**", "xxx");

但我不能,我在签名中删除了const,否则我得到了:

  

错误:没有匹配的调用函数   'createFormattedPlainText(QString&,const char [3],const char [2],   const char [3])'createFormattedPlainText(l1,l2,“123”,“**”,   “xxx”);   ??   我做错了什么?

1 个答案:

答案 0 :(得分:1)

您使用arg()是错误的,没有其他问题,您的功能签名是有效且正确的。

void createFormattedPlainText(QString & refLine, const QString & v1, const QString & v2, const QString & v3)
{
  refLine.clear();
  refLine.append("[%0] :: [%1] ++ %2").arg(v1, v2, v3);
}

int main(int argc, char *argv[])
{
QString line;
createFormattedPlainText(line, "123", "**", "xxx");
qDebug() << "line = " << line;
//...

<强>输出:

line =  "[%0] :: [%1] ++ %2" 

正确版本:

void createFormattedPlainText(QString & refLine, const QString & v1, const QString & v2, const QString & v3)
{
  refLine.clear();
  refLine.append(QString("[%0] :: [%1] ++ %2").arg(v1, v2, v3));//Attention here
}

int main(int argc, char *argv[])
{
QString line;
createFormattedPlainText(line, "123", "**", "xxx");
qDebug() << "line = " << line;
//...

<强>输出:

line =  "[123] :: [**] ++ xxx" 

来自doc

  

返回此字符串的副本,其编号最小的位置标记   由字符串a替换,即%1,%2,...,%99。

在您的情况refLine.append("[%0] :: [%1] ++ %2").arg(v1, v2, v3);中,您将副本返回到无处。在我的情况refLine.append(QString("[%0] :: [%1] ++ %2").arg(v1, v2, v3));中,我附加了由refLine处理的arg()完全构造的字符串。

P.S。当然你可以做下一个(使用旧代码):

void createFormattedPlainText(QString & refLine, const QString & v1, const QString & v2, const QString & v3)
{
  refLine.clear();
  //arg() returns copy so just assign this copy to the refLine again
  refLine = refLine.append("[%0] :: [%1] ++ %2").arg(v1, v2, v3);
}

但我认为这是一个糟糕的代码,我写这封只是为了告诉你arg()返回副本。