A concatenação de strings não funciona como esperado [fechado]

84

Sei que é um problema comum, mas procurando referências e outros materiais não encontro uma resposta clara para essa pergunta.

Considere o seguinte código:

#include <string>

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

O compilador me diz que não consegue encontrar um operador sobrecarregado para char[dim] .

Isso significa que na string não há um operador +?

Mas em vários exemplos, há uma situação como esta. Se esta não é a maneira correta de concatear mais strings, qual é a melhor maneira?

Andry
fonte
15
Seu código deve compilar bem, o que significa que você não está mostrando o código exato que causa o erro (além de não postar a mensagem de erro exata).
sbi
Bem, não funciona ... Provavelmente minha culpa é que eu não forneci o compilador ... é g ++ não vc ... :)
Andry

Respostas:

153

Seu código, conforme escrito, funciona. Você provavelmente está tentando alcançar algo não relacionado, mas semelhante:

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

Isso não funciona porque para C ++ parece que você está tentando adicionar dois charponteiros. Em vez disso, você precisa converter pelo menos um dos char*literais em a std::string. Ou você pode fazer o que você já postou a pergunta (como eu disse, este código vai funcionar) ou você faça o seguinte:

std::string c = std::string("hello") + "world";
Konrad Rudolph
fonte
3
char * é um ponteiro e não pode ser adicionado simplesmente porque requer uma alocação de memória. std :: strings esconde a alocação, é por isso que é possível fornecer um operador + para eles.
Vincent Robert
12
@Andry: O motivo pelo qual isso não funciona é que C ++ herda seus literais de string de C, e é por isso que eles são do tipo const char[], em vez de std::string. Em C (e, portanto, também em C ++) os arrays decaem para ponteiros com muita facilidade, e é por isso que "a" + "b" invocará o operador interno que adiciona dois ponteiros. O resultado disso (um ponteiro apontando para algum lugar na memória) é, obviamente, totalmente inútil, mas mesmo assim é com o que estamos presos.
sbi
2
@Andry: razoável, mas errado. A alocação não tem nada a ver com isso. A explicação dada por @sbi é a correta (além do fato de que o resultado da adição de um ponteiro não é outro ponteiro - é simplesmente impossível adicionar dois ponteiros, pois o resultado não teria sentido).
Konrad Rudolph
1
Além disso, os literais de string diretamente adjacentes são concatenados automaticamente pelo compilador. std::string c = "Hello" "world";, por exemplo, resultará em c == "Helloworld".
Fang de
1
Você também pode usar literais de string: std;:string c = "hello"s + "world"s;ou apenas tornar um deles um std::string.
Rakete1111
46
std::string a = "Hello ";
a += "World";
Svisstack
fonte
2
Seria +1 se eu tivesse votos positivos restantes!
jwueller
Desculpe, o C ++ não C # i + = não funciona aqui, para o qual é usado
Pratik
18
@Pratik Tem certeza?
Fraser
5

Eu faria isso:

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

Que compila no VS2008.

graham.reeds
fonte
1
Também deve funcionar no gcc.
graham.reeds
5
std::string a = "Hello ";
std::string b = "World ";
std::string c = a;
c.append(b);
Teodor Pripoae
fonte