10
votes

C ++ ne peut pas convertir 'const char *' 'to' std :: string * '

J'ai ce code ci-dessous et je reçois l'erreur lors de la compilation:

Erreur: impossible de convertir 'const char *' 'à' std :: string * 'pour l'argument' 1 '1' to 'Void SilyFunction (std :: string *, int) ' xxx


0 commentaires

8 Réponses :


15
votes

Ne prenez pas votre paramètre en tant que String * code> Essayez simplement d'utiliser un consttron et code> à la place

edit: p>

STD :: String Code> et Const Char * Code> sont différents types. Le std :: string code> a déjà une conversion des littéraux de chaîne (Ex: "cool" code>) à l'objet de chaîne réelle. Donc, en passant dans la chaîne littéral "cool" code> vous êtes dans un sens qui passe dans un std :: string code> objet, pas un pointeur à un. P>

La raison pour laquelle j'ai choisi d'utiliser un const String & code> est principalement des pratiques de codage personnel. Cela minimise l'utilisation de la mémoire de pile et que vous passez dans un littéral à chaîne constante, il n'est pas nécessaire que le paramètre soit modifié. P>

N'oubliez pas si vous changez d'un String * code> que vous n'avez plus besoin de la désirer dans votre COUT CODE>: P>

if (cool){
    for (int i=0; i<counter; i++) cout << str << endl;
} else {
    cout << str << endl;
}


1 commentaires

Si vous élaborez votre réponse et expliquez pourquoi il devrait le faire, je vais uppouver votre réponse.



3
votes

Changer xxx

à xxx


0 commentaires

1
votes

Vous pouvez obtenir cela en modifiant le prototype sur:

void sillyFunction(string const &str, int cool=0);


2 commentaires

Ne devrait-il pas être const string & str ?


@ultimatebuster, c'est la même chose. C'est juste une question de goût comment écrire cela.



1
votes

Vous pouvez convertir à partir d'un const char * code> à un chaîne code>, mais pas à une chaîne * code>.

Peut-être que vous voulez que votre SILLYLYFunction CODE> Pour prendre une référence Const? P>

void sillyFunction(const string &str, int cool){
    counter++;
    if (cool){
        for (int i=0; i<counter; i++) cout << str << endl;
    } else {
        cout << str << endl;
    }
}


0 commentaires

1
votes

devrait être xxx


0 commentaires

1
votes

Si vous allez utiliser des pointeurs pour vos fonctions, vous devez déclarer les chaînes quelque part. la mémoire doit être allouée. Donc, déclarez une variable ou appelez de nouveau pour créer une mémoire pour la chaîne.

int main(){
    string str = "Cool";
    string str2 = "Cooler";
    sillyFunction(&str);
    sillyFunction(&str2, 1);
    return 0;
}


0 commentaires

3
votes

Pour expliquer ce que le problème est ...

tandis que le compilateur organisera avec plaisir à un char * / c-string à être "converti" sur un std :: string via le STD approprié: : String constructeur, ce n'est pas ce que vous avez demandé.

Vous avez demandé un pointeur à un std :: string objet. Par définition, ce qui est transmis à votre fonction doit être l'adresse d'un déjà existant std :: string (ou descendant) objet.

Vous devez comprendre les pointeurs comme type distinct - Votre fonction prend un pointeur-to-std :: chaîne "objet". Tandis qu'un std :: string est accessible via un pointeur sur std :: string , le pointeur lui-même est pas a STD: : chaîne , ni "converti" sur un std :: chaîne , ni traite comme un pointeur à caractère (ou vice-versa).

L'alternative la plus facile est en effet une référence constante à un std :: string ( const std :: string & ). Const, dans ce cas, parce que vous ne faites rien pour modifier la chaîne. Si vous étiez, ce serait une question différente et que vous devriez examiner attentivement si vous avez l'intention de voir l'appelant de voir vos modifications.

En faisant cela, vous dites que vous voulez un objet std :: string objet (rappelez-vous, une référence à un objet est cet objet , voir C ++ FAQ 8.5 en particulier), ce qui permet au compilateur d'invoquer le système approprié Constructeur pour créer une chaîne STD :: String pour vous lorsque la fonction est appelée avec un char * (const ou non).

En même temps, si quelqu'un vous transmet un réel std :: string , le constructeur est évité et vous obtenez la même efficacité que si vous aviez pris un < Code> Pointeur-to-std :: String . Gagnant-gagnant.

Alternativement, bien sûr, vous pouvez simplement prendre une plaine std :: string , mais dans ce cas, vous toujours obtenir une copie de la chaîne étant transmise, que ce soit C'est une c-string ou un std :: string . Parfois c'est désirable, parfois pas. Dans votre cas, vous ne faites rien d'autre que d'imprimer la cordon, rendant les frais généraux inutiles.


0 commentaires

0
votes

J'ai une solution très simple pour cela, en utilisant la copie de chaîne

char s [20] Strcpy (s, const char * p);

alors vous avez la ficelle pointée par * p à s ... ça marche ..


0 commentaires