C ++ kann 'const char *' nicht in 'std :: string *' konvertieren

7

Ich habe diesen Code unten und ich bekomme den Fehler beim Kompilieren:

error: cannot convert 'const char*' to 'std::string*' for argument '1' to 'void sillyFunction(std::string*, int)'

%Vor%     
Pwnna 13.05.2011, 13:55
quelle

8 Antworten

12

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:

%Vor%     
Dan F 13.05.2011, 13:57
quelle
3

ändern

%Vor%

bis

%Vor%     
Sam Miller 13.05.2011 13:58
quelle
2

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.

    
Nicholas Knight 13.05.2011 14:28
quelle
1

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?

%Vor%     
Nick Meyer 13.05.2011 13:58
quelle
1

Sollte

sein %Vor%     
Marius Bancila 13.05.2011 13:59
quelle
1

Wenn Sie Zeiger für Ihre Funktionen verwenden wollen, müssen Sie die Strings irgendwo deklarieren. Speicher muss zugewiesen werden. deklarieren Sie entweder eine Variable oder rufen Sie new auf, um Speicher für die Zeichenfolge zu erstellen.

%Vor%     
richmb 13.05.2011 14:02
quelle
1

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.

    
detunized 13.05.2011 13:58
quelle
0

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 ..

    
dibin_salher 04.02.2012 09:52
quelle

Tags und Links