Łączenie ciągów nie działa zgodnie z oczekiwaniami [zamknięte]

84

Wiem, że to częsty problem, ale szukając referencji i innych materiałów nie znajduję jednoznacznej odpowiedzi na to pytanie.

Rozważ następujący kod:

#include <string>

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

Kompilator mówi mi, że nie może znaleźć przeciążonego operatora dla char[dim].

Czy to oznacza, że ​​w ciągu nie ma operatora +?

Ale w kilku przykładach jest taka sytuacja. Jeśli to nie jest właściwy sposób łączenia większej liczby ciągów, jaki jest najlepszy sposób?

Andry
źródło
15
Twój kod powinien się dobrze skompilować, co oznacza, że ​​nie pokazujesz dokładnego kodu, który powoduje błąd (oprócz niepublikowania dokładnego komunikatu o błędzie).
sbi
Cóż, to nie działa ... Prawdopodobnie moja wina jest taka, że ​​nie dostarczyłem kompilatora ... to g ++ nie vc ... :)
Andry

Odpowiedzi:

153

Twój kod, tak jak napisano, działa. Prawdopodobnie próbujesz osiągnąć coś niezwiązanego, ale podobnego:

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

To nie działa, ponieważ dla C ++ wygląda na to, że próbujesz dodać dwa charwskaźniki. Zamiast tego musisz przekonwertować co najmniej jeden z char*literałów na plik std::string. Albo można zrobić to, co już pisał w pytaniu (jak powiedziałem, to kod będzie działać) lub wykonać następujące czynności:

std::string c = std::string("hello") + "world";
Konrad Rudolph
źródło
3
char * jest wskaźnikiem i nie można go dodać tylko dlatego, że wymaga alokacji pamięci. std :: strings ukrywa alokację, dlatego można podać im operator +.
Vincent Robert
12
@Andry: Powodem, dla którego to nie działa, jest to, że C ++ dziedziczy swoje literały łańcuchowe z C, dlatego są one const char[]raczej tego typu niż std::string. W C (a więc także w C ++) tablice bardzo łatwo rozpadają się na wskaźniki, dlatego „a” + „b” wywoła wbudowany operator, który dodaje dwa wskaźniki. Rezultat tego (wskaźnik wskazujący gdzieś w pamięci) jest oczywiście całkiem bezużyteczny, ale mimo to utknęliśmy z tym.
sbi
2
@Andry: rozsądne, ale złe. Alokacja nie ma z tym nic wspólnego. Wyjaśnienie podane przez @sbi jest poprawne (poza tym, że wynik dodania wskaźnika nie jest kolejnym wskaźnikiem - po prostu niemożliwe jest dodanie dwóch wskaźników, ponieważ wynik byłby bez znaczenia).
Konrad Rudolph
1
Ponadto bezpośrednio sąsiadujące literały ciągów są automatycznie konkatenowane przez kompilator. std::string c = "Hello" "world";na przykład spowoduje c == "Helloworld".
Fang
1
Możesz także użyć literałów ciągów: std;:string c = "hello"s + "world"s;lub po prostu nadać jednemu z nich plik std::string.
Rakete1111
46
std::string a = "Hello ";
a += "World";
Svisstack
źródło
2
Byłoby +1, gdybym miał głosy za!
jwueller
Przepraszam, że C ++ nie C # i + = nie działa tutaj, do którego jest używany
Pratik
18
@Pratik Jesteś pewien?
Fraser,
5

Zrobiłbym to:

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

Który kompiluje się w VS2008.

graham.reeds
źródło
1
Powinien również działać w gcc.
graham.reeds
5
std::string a = "Hello ";
std::string b = "World ";
std::string c = a;
c.append(b);
Teodor Pripoae
źródło