我的代码既支持本机C ++类型,也支持Qt类型。例如,string
和QString
是“等价的”。
我有2个函数,一个用string
个,一个用QString
个。 QString
版本将参数转换为string
,然后调用函数的string
版本。
以下是该问题的一些通用代码:
int myClass::LoadQString(const QString &tagName, QString &toReturn)
{
string tag = tagName.toStdString();
string ret = toReturn.toStdString();
//string& ret = toReturn.toStdString(); //This gives me an error
return LoadString(tag, ret);
}
int myClass::LoadString(const string& tagName, string& toReturn)
{
toReturn = "hello world!";
...
}
因此,此代码将编译并运行...但是,当我调用LoadQString()
时,第二个参数返回时为空QString
。您可以在我的注释行中看到我尝试string& ret = ...
来获取工作的引用。如果我调用LoadString()
,然后在它返回时检查toReturn
的值,它将是“hello world!”如预期的那样。
试图让LoadQString()
正常工作。
感谢您的帮助!
答案 0 :(得分:3)
std::string
版本调用后,您应该从QString
转换回std::string
int myClass::LoadQString(const QString &tagName, QString &toReturn)
{
string tag = tagName.toStdString();
string ret = toReturn.toStdString();
int retCode = LoadString(tag, ret);
toReturn = QString::fromStdString(ret);
return retCode;
}
答案 1 :(得分:0)
您应该致电LoadString
,而不是LoadXMLAttribute
,然后在调用ret
之后将toReturn
分配给int
,然后返回LoadString
{ {1}}已退回。
答案 2 :(得分:0)
首先,toStdString创建一个std :: string对象作为临时对象。所以你自然无法从中获取引用,你必须将结果存储在一个值中,或者通过const引用来延长它的生命周期。
但是,对于您正在做的事情,假设toReturn
严格来说是输出参数,并且LoadString执行实际工作:
int myClass::LoadQString(const QString &tagName, QString &toReturn)
{
string tag = tagName.toStdString();
string ret;
int result = LoadXMLAttribute(tag, ret);
toReturn = QString::fromStdString(ret);
return result;
}
如果toReturn
不是严格意义上的输出参数,而是输入参数(我建议您避免这样做,因为它是一个相当令人困惑的设计实践):
int myClass::LoadQString(const QString &tagName, QString &toReturn)
{
string tag = tagName.toStdString();
string ret = toReturn.toStdString();
int result = LoadXMLAttribute(tag, ret);
toReturn = QString::fromStdString(ret);
return result;
}
非常简单。从QString转换为std :: string,调用接受std :: strings的函数,存储返回值,并将输出参数(ret)转换回分配给输出参数的QString(toReturn)。