La concaténation de chaînes ne fonctionne pas comme prévu [fermé]

84

Je sais que c'est un problème courant, mais à la recherche de références et d'autres documents, je ne trouve pas de réponse claire à cette question.

Considérez le code suivant:

#include <string>

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

Le compilateur me dit qu'il ne trouve pas d'opérateur surchargé pour char[dim].

Cela signifie-t-il que dans la chaîne il n'y a pas d'opérateur +?

Mais dans plusieurs exemples, il y a une situation comme celle-ci. Si ce n'est pas la bonne façon de concater plus de chaînes, quelle est la meilleure façon?

Andry
la source
15
Votre code devrait être compilé correctement, ce qui signifie que vous n'affichez pas le code exact qui cause l'erreur (en plus de ne pas publier le message d'erreur exact).
sbi
Bon ça ne marche pas ... Probablement ma faute est que je n'ai pas fourni de compilateur ... c'est g ++ pas vc ... :)
Andry

Réponses:

153

Votre code, tel qu'il est écrit, fonctionne. Vous essayez probablement de réaliser quelque chose sans rapport, mais similaire:

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

Cela ne fonctionne pas car pour C ++, il semble que vous essayez d'ajouter deux charpointeurs. Au lieu de cela, vous devez convertir au moins l'un des char*littéraux en un fichier std::string. Ou vous pouvez faire ce que vous avez déjà la question a écrit dans (comme je le disais, ce code va travailler) ou vous effectuez les opérations suivantes:

std::string c = std::string("hello") + "world";
Konrad Rudolph
la source
3
char * est un pointeur, et ne peut pas être ajouté simplement parce qu'il nécessite une allocation de mémoire. std :: strings masque l'allocation, c'est pourquoi il est possible de leur fournir un opérateur +.
Vincent Robert
12
@Andry: La raison pour laquelle cela ne fonctionne pas est que C ++ hérite ses littéraux de chaîne de C, c'est pourquoi ils sont du type const char[]plutôt que std::string. En C (et donc aussi en C ++), les tableaux se désintègrent très facilement en pointeurs, c'est pourquoi "a" + "b" invoquera l'opérateur intégré qui ajoute deux pointeurs. Le résultat de cela (un pointeur pointant quelque part dans la mémoire) est bien sûr tout à fait inutile, mais c'est néanmoins ce à quoi nous sommes coincés.
sbi
2
@Andry: raisonnable mais faux. L'allocation n'a rien à voir avec cela. L'explication donnée par @sbi est la bonne (mis à part le fait que le résultat d'un ajout de pointeur n'est pas un autre pointeur - il est tout simplement impossible d'ajouter deux pointeurs, car le résultat n'aurait aucun sens).
Konrad Rudolph
1
En outre, les littéraux de chaîne directement adjacents sont automatiquement concaténés par le compilateur. std::string c = "Hello" "world";, par exemple, se traduira par c == "Helloworld".
Fang
1
Vous pouvez également utiliser des chaînes littérales: std;:string c = "hello"s + "world"s;ou simplement en faire un std::string.
Rakete1111
46
std::string a = "Hello ";
a += "World";
Svisstack
la source
2
Serait +1 s'il me restait des votes positifs!
jwueller
Désolé son C ++ pas C # i + = ne fonctionne pas ici, pour lequel il est utilisé
Pratik
18
@Pratik Vous êtes sûr?
Fraser
5

Je ferais ceci:

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

Qui compile dans VS2008.

graham.reeds
la source
1
Devrait également fonctionner dans gcc.
graham.reeds
5
std::string a = "Hello ";
std::string b = "World ";
std::string c = a;
c.append(b);
Teodor Pripoae
la source