Question

J'ai du code qui prend en charge à la fois les types C++ natifs et les types Qt.Par exemple il y a string'sable QStringqui sont "équivalents".

J'ai 2 fonctions, une qui prend stringet celui qui prend QString's.Le QString version convertit les paramètres en string's et appelle ensuite le string version de la fonction.

Voici un code générique du problème :

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!";

    ...
}

Ainsi, ce code sera compilé et exécuté... cependant, lorsque j'appelle LoadQString() le deuxième paramètre est vide QString une fois qu'il revient.Vous pouvez voir dans ma ligne de commentaire où j'ai essayé string& ret = ... pour que la référence fonctionne.Si j'appelle LoadString() puis vérifiez la valeur de toReturn À son retour, ce sera "Hello World!" comme prévu.

J'essaie juste d'obtenir le LoadQString() pour fonctionner correctement.

Merci pour votre aide!

Était-ce utile?

La solution

Vous devriez convertir de std::string retour à QString après std::string appel de version

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;
}

Autres conseils

Tu devrais appeler LoadString, pas LoadXMLAttribute, puis attribuez ret à toReturn après l'avoir appelé, renvoyez le int que LoadString revenu.

Tout d'abord, toStdString crée un objet std::string comme temporaire.Donc, naturellement, vous ne pouvez pas en tirer une référence, vous devez stocker le résultat dans une valeur ou prolonger sa durée de vie via une référence const.

Cependant, pour ce que vous faites, en supposant toReturn est strictement un paramètre de sortie et que LoadString effectue le travail réel :

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;
}

Si toReturn n'est pas strictement un paramètre de sortie mais aussi un paramètre d'entrée (je vous recommande d'éviter cela car c'est une pratique de conception plutôt déroutante) :

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;
}

Assez simple.Convertissez de QString en std :: string, appelez votre fonction qui accepte std :: strings, stockez la valeur de retour et reconvertissez le paramètre de sortie (ret) en un QString attribué à votre paramètre de sortie (toReturn).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top