Łą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?


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";

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


5

Zrobiłbym to:

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

Który kompiluje się w VS2008.


1
Powinien również działać w gcc.
graham.reeds

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.