Nimm deinen Parameter nicht als string *
, versuche nur mit const string &
anstatt
BEARBEITEN:
std::string
und const char*
sind unterschiedliche Typen. Die std::string
hat bereits eine Umwandlung von String-Literalen (zB "Cool"
) in das eigentliche String-Objekt. Indem Sie also das String-Literal "Cool"
übergeben, übergeben Sie gewissermaßen ein std::string
-Objekt und keinen Zeiger auf eins.
Der Grund, warum ich mich für die Verwendung von const string &
entschieden habe, liegt hauptsächlich in den persönlichen Programmierpraktiken. Dies minimiert die Verwendung von Stack-Speichern, und da Sie ein konstantes String-Literal übergeben, muss der Parameter nicht änderbar sein.
Vergessen Sie auch nicht, wenn Sie von einem string *
abrücken, das Sie nicht mehr in Ihrem cout
dereferenzieren müssen:
Um zu erklären, was das Problem eigentlich ist ...
Während der Compiler gerne dafür sorgt, dass ein char *
/ C-String über den entsprechenden std::string
-Konstruktor in ein std::string
"konvertiert" wird, haben Sie das nicht verlangt.
Sie haben nach einem -Zeiger für ein vorhandenes std::string
-Objekt gefragt. Was an Ihrer Funktion übergeben wird, muss definitionsgemäß die Adresse eines bereits vorhandenen std::string
(oder Nachkommen) -Objekts sein.
Sie müssen Zeiger als unterschiedlichen Typ verstehen - Ihre Funktion benötigt ein pointer-to-std::string
"Objekt". Während auf einen std::string
über einen Zeiger auf std::string
zugegriffen werden kann, ist der Zeiger selbst nicht a std::string
, noch kann er in ein std::string
"konvertiert" werden, noch kann er es sein behandelt als ein Zeiger auf Zeichen (oder umgekehrt).
Die einfachste Alternative ist in der Tat eine konstante Referenz auf ein std::string
( const std::string &
). const, in diesem Fall, weil Sie nichts tun, um die Zeichenfolge zu ändern. Wenn Sie das täten, wäre das eine andere Sache, und Sie müssten sorgfältig abwägen, ob Sie beabsichtigen, dass der Anrufer Ihre Änderungen sieht.
Indem Sie dies tun, sagen Sie, dass Sie ein Objekt std::string
wollen (denken Sie daran, ein Verweis auf ein Objekt ist das Objekt , siehe C ++ FAQ 8.5 im Besonderen), was es dem Compiler ermöglicht, den entsprechenden Konstruktor aufzurufen, um eine std :: string für Sie zu erstellen, wenn die Funktion wird mit einem char *
(const oder nicht) aufgerufen.
Zur gleichen Zeit, wenn jemand Ihnen eine tatsächliche std::string
übergibt, wird der Konstruktor vermieden und Sie erhalten die gleiche Effizienz, als ob Sie eine pointer-to-std::string
genommen hätten. Win-Win.
Alternativ können Sie natürlich auch eine einfache std::string
verwenden, aber in diesem Fall erhalten Sie immer eine Kopie der übergebenen Zeichenfolge, unabhängig davon, ob es sich um eine C-Zeichenfolge oder eine% -Angabe handelt. Code%. Manchmal ist das wünschenswert, manchmal nicht. In Ihrem Fall tun Sie nichts, außer die Zeichenfolge auszudrucken, was den Overhead unnötig macht.
Sie können von einem const char *
zu einem string
konvertieren, aber nicht zu einem string *
.
Vielleicht möchten Sie, dass Ihre sillyFunction
eine const-Referenz verwendet?
Sie können dies erreichen, indem Sie den Prototyp in
ändern %Vor% char const *
könnte implizit in ein temporäres std::string
konvertiert werden, das wiederum als Referenz übergeben werden kann ( std::string const &
). Es gibt keine implizite Konvertierung in einen Zeiger ( std::string *
), deshalb erhalten Sie den Fehler.
Ich habe eine variante einfache Lösung für das mit String-Kopie
Zeichen s [20] strcpy (s, const char * p);
ten Sie die Zeichenfolge pointrd von * p in s ... es funktioniert ..