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) ' code> p>
8 Réponses :
Ne prenez pas votre paramètre en tant que edit: p> La raison pour laquelle j'ai choisi d'utiliser un N'oubliez pas si vous changez d'un String * code> Essayez simplement d'utiliser un
consttron et code> à la place
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>
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>
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;
}
Si vous élaborez votre réponse et expliquez pourquoi il devrait le faire, je vais uppouver votre réponse.
Changer à p>
Vous pouvez obtenir cela en modifiant le prototype sur:
void sillyFunction(string const &str, int cool=0);
Ne devrait-il pas être const string & str code>?
@ultimatebuster, c'est la même chose. C'est juste une question de goût comment écrire cela.
Vous pouvez convertir à partir d'un Peut-être que vous voulez que votre const char * code> à un
chaîne code>, mais pas à une chaîne
* code>.
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;
}
}
devrait être
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; }
Pour expliquer ce que le problème est em> ... p>
tandis que le compilateur organisera avec plaisir à un Vous avez demandé un pointeur em> à un em> Vous devez comprendre les pointeurs comme type distinct - Votre fonction prend un L'alternative la plus facile est en effet une référence constante à un En faisant cela, vous dites que vous voulez un objet En même temps, si quelqu'un vous transmet un réel em> Alternativement, bien sûr, vous pouvez simplement prendre une plaine char * code> / c-string à être "converti" sur un
std :: string code> via le
STD approprié: : String code> constructeur, ce n'est pas ce que vous avez demandé. p>
std :: string code> objet. Par définition, ce qui est transmis à votre fonction doit être l'adresse d'un déjà existant strud>
std :: string code> (ou descendant) objet. P>
pointeur-to-std :: chaîne code> "objet". Tandis qu'un
std :: string code> est accessible via un pointeur sur
std :: string code>, le pointeur lui-même est pas em> a
STD: : chaîne code>, ni "converti" sur un
std :: chaîne code>, ni traite comme un pointeur à caractère (ou vice-versa). P >
std :: string code> (
const std :: string & code>). 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. P>
std :: string code> objet (rappelez-vous, une référence à un objet est cet objet em>, 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 * code> (const ou non). p>
std :: string code>, le constructeur est évité et vous obtenez la même efficacité que si vous aviez pris un < Code> Pointeur-to-std :: String Code>. Gagnant-gagnant. P>
std :: string code>, mais dans ce cas, vous toujours em> obtenir une copie de la chaîne étant transmise, que ce soit C'est une c-string ou un
std :: string code>. 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. P>
J'ai une solution très simple pour cela, en utilisant la copie de chaîne p>
char s [20] Strcpy (s, const char * p); p>
alors vous avez la ficelle pointée par * p à s ... ça marche .. p>