La concatenación de cadenas no funciona como se esperaba [cerrado]

84

Sé que es un problema común, pero buscando referencias y otro material no encuentro una respuesta clara a esta pregunta.

Considere el siguiente código:

#include <string>

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

El compilador me dice que no puede encontrar un operador sobrecargado para char[dim].

¿Significa que en la cadena no hay un operador +?

Pero en varios ejemplos hay una situación como esta. Si esta no es la forma correcta de concanear más cadenas, ¿cuál es la mejor forma?

Andry
fuente
15
Su código debería compilarse bien, lo que significa que no está mostrando el código exacto que causa el error (además de no publicar el mensaje de error exacto).
sbi
Bueno, no funciona ... Probablemente mi culpa es que no proporcioné el compilador ... es g ++ no vc ... :)
Andry

Respuestas:

153

Su código, tal como está escrito, funciona. Probablemente esté tratando de lograr algo no relacionado, pero similar:

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

Esto no funciona porque para C ++ parece que estás intentando agregar dos charpunteros. En su lugar, debe convertir al menos uno de los char*literales a std::string. O se puede hacer lo que ya se haya publicado en la pregunta (como ya he dicho, este código será trabajar) o de hacer lo siguiente:

std::string c = std::string("hello") + "world";
Konrad Rudolph
fuente
3
char * es un puntero y no se puede agregar simplemente porque requiere una asignación de memoria. std :: strings ocultan la asignación, por eso es posible proporcionar un operador + para ellos.
Vincent Robert
12
@Andry: La razón por la que esto no funciona es que C ++ hereda sus literales de cadena de C, razón por la cual son del tipo const char[], en lugar de std::string. En C (y por lo tanto también en C ++) las matrices se convierten en punteros muy fácilmente, por lo que "a" + "b" invocará el operador incorporado que agrega dos punteros. El resultado de eso (un puntero apuntando a algún lugar de la memoria) es, por supuesto, bastante inútil, pero, sin embargo, esto es lo que nos atasca.
sbi
2
@Andry: razonable pero incorrecto. La asignación no tiene nada que ver con esto. La explicación dada por @sbi es la correcta (aparte del hecho de que el resultado de la adición de un puntero no es otro puntero; es simplemente imposible agregar dos punteros, ya que el resultado no tendría sentido).
Konrad Rudolph
1
Además, el compilador concatena automáticamente los literales de cadena directamente adyacentes. std::string c = "Hello" "world";, por ejemplo, resultará en c == "Helloworld".
Fang
1
También puede usar cadenas literales: std;:string c = "hello"s + "world"s;o simplemente hacer que uno de ellos sea un std::string.
Rakete1111
46
std::string a = "Hello ";
a += "World";
Svisstack
fuente
2
¡Sería +1 si me quedaran votos a favor!
jwueller
Lo siento, es C ++, no C # i + = no funciona aquí, para lo cual se usa
Pratik
18
@Pratik ¿ Estás seguro?
Fraser
5

Yo haría esto:

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

Que se compila en VS2008.

graham.reeds
fuente
1
También debería funcionar en gcc.
graham.reeds
5
std::string a = "Hello ";
std::string b = "World ";
std::string c = a;
c.append(b);
Teodor Pripoae
fuente