Das Verketten von Zeichenfolgen funktioniert nicht wie erwartet [geschlossen]

84

Ich weiß, dass es ein häufiges Problem ist, aber wenn ich nach Referenzen und anderem Material suche, finde ich keine klare Antwort auf diese Frage.

Betrachten Sie den folgenden Code:

#include <string>

// ...
// in a method
std::string a = "Hello ";
std::string b = "World";
std::string c = a + b;

Der Compiler teilt mir mit, dass er keinen überladenen Operator für finden kann char[dim].

Bedeutet das, dass es in der Zeichenfolge keinen + -Operator gibt?

In einigen Beispielen gibt es jedoch eine Situation wie diese. Wenn dies nicht der richtige Weg ist, um mehr Strings zu konzentrieren, was ist der beste Weg?

Andry
quelle
15
Ihr Code sollte einwandfrei kompiliert werden, was bedeutet, dass Sie nicht den genauen Code anzeigen, der den Fehler verursacht (zusätzlich dazu, dass Sie nicht die genaue Fehlermeldung veröffentlichen).
sbi
Nun, es funktioniert nicht ... Wahrscheinlich ist mein Fehler, dass ich keinen Compiler zur Verfügung gestellt habe ... es ist g ++ nicht vc ... :)
Andry

Antworten:

153

Ihr Code funktioniert wie geschrieben. Sie versuchen wahrscheinlich, etwas zu erreichen, das nichts damit zu tun hat, aber ähnlich ist:

std::string c = "hello" + "world";

Dies funktioniert nicht, da Sie in C ++ anscheinend versuchen, zwei charZeiger hinzuzufügen . Stattdessen Sie müssen mindestens eine der konvertieren char*Literale ein std::string. Entweder können Sie tun , was Sie bereits in der Frage gestellt haben (wie gesagt, dieser Code wird funktionieren) , oder Sie wie folgt vor :

std::string c = std::string("hello") + "world";
Konrad Rudolph
quelle
3
char * ist ein Zeiger und kann nicht einfach hinzugefügt werden, da eine Speicherzuweisung erforderlich ist. std :: strings verbergen die Zuordnung, deshalb ist es möglich, einen Operator + für sie bereitzustellen.
Vincent Robert
12
@Andry: Der Grund, warum dies nicht funktioniert, ist, dass C ++ seine String-Literale von C erbt, weshalb sie eher vom Typ const char[]als vom Typ sind std::string. In C (und damit auch in C ++) zerfallen Arrays sehr leicht in Zeiger, weshalb "a" + "b" den eingebauten Operator aufruft, der zwei Zeiger hinzufügt. Das Ergebnis davon (ein Zeiger, der irgendwo in den Speicher zeigt) ist natürlich ziemlich nutzlos, aber dennoch bleiben wir dabei.
sbi
2
@ Andy: vernünftig aber falsch. Die Zuordnung hat damit nichts zu tun. Die Erklärung von @sbi ist die richtige (abgesehen von der Tatsache, dass das Ergebnis einer Zeigeraddition kein weiterer Zeiger ist - es ist einfach unmöglich, zwei Zeiger hinzuzufügen, da das Ergebnis bedeutungslos wäre).
Konrad Rudolph
1
Darüber hinaus werden direkt benachbarte Zeichenfolgenliterale vom Compiler automatisch verkettet. std::string c = "Hello" "world";Dies führt beispielsweise zu c == "Helloworld".
Fang
1
Sie können auch Zeichenfolgenliterale verwenden: std;:string c = "hello"s + "world"s;oder einfach eines davon a std::string.
Rakete1111
46
std::string a = "Hello ";
a += "World";
Svisstack
quelle
2
Wäre +1, wenn ich noch Upvotes hätte!
Jwueller
Tut mir leid, dass C ++ nicht C # i + = hier nicht funktioniert, wofür es verwendet wird
Pratik
18
@Pratik Bist du sicher?
Fraser
5

Ich würde das tun:

std::string a("Hello ");
std::string b("World");
std::string c = a + b;

Welche kompiliert in VS2008.

graham.reeds
quelle
1
Sollte auch in gcc funktionieren.
Graham.reeds
5
std::string a = "Hello ";
std::string b = "World ";
std::string c = a;
c.append(b);
Teodor Pripoae
quelle