Объединение строк не работает должным образом

Я знаю, что это распространенная проблема, но, ища ссылки и другие материалы, я не нахожу четкого ответа на этот вопрос.

Рассмотрим следующий код:

#include <string>

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

Компилятор сообщает мне, что не может найти перегруженный оператор для char[dim].

Означает ли это, что в строке нет оператора +?

Но в нескольких примерах есть ситуация, подобная этой. Если это не правильный способ объединить больше строк, как лучше всего?


person Andry    schedule 29.11.2010    source источник
comment
Ваш код должен скомпилироваться просто отлично, что означает, что вы не показываете точный код, который вызывает ошибку (помимо того, что вы не публикуете точное сообщение об ошибке).   -  person sbi    schedule 29.11.2010
comment
Что ж, не работает... Наверное, я виноват, что не предоставил компилятор... это g++, а не vc... :)   -  person Andry    schedule 29.11.2010


Ответы (3)


Ваш код, как написано, работает. Вероятно, вы пытаетесь добиться чего-то несвязанного, но похожего:

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

Это не работает, потому что для C++ это выглядит так, как будто вы пытаетесь добавить два указателя char. Вместо этого вам нужно преобразовать хотя бы один из литералов char* в std::string. Либо вы можете сделать то, что вы уже разместили в вопросе (как я уже сказал, этот код будет работать), либо сделать следующее:

std::string c = std::string("hello") + "world";
person Konrad Rudolph    schedule 29.11.2010
comment
Большое спасибо... хорошо, это работает... Я ожидал, что проблема в этом... но на самом деле.... Нет хорошо предоставленного оператора для объединения двух строк (я имею в виду два символа*)???? ? это действительно странно... Есть ли причина, по которой стандартные библиотеки не поддерживают такую ​​простую вещь (думаю, она должна быть). - person Andry; 29.11.2010
comment
char* является указателем и не может быть добавлен просто потому, что требует выделения памяти. std::strings скрывают выделение, поэтому для них можно указать оператор +. - person Vincent Robert; 29.11.2010
comment
@Andry: Причина, по которой это не работает, заключается в том, что C++ наследует свои строковые литералы от C, поэтому они имеют тип const char[], а не std::string. В C (и, следовательно, также в C++) массивы очень легко распадаются на указатели, поэтому a+b вызовет встроенный оператор, добавляющий два указателя. Результат этого (указатель, указывающий куда-то в память), конечно, совершенно бесполезен, но тем не менее это то, с чем мы застряли. - person sbi; 29.11.2010
comment
@ Винсент Спасибо. Что ж, вполне разумное объяснение... - person Andry; 29.11.2010
comment
@Andry: разумно, но неправильно. Распределение не имеет к этому никакого отношения. Объяснение, данное @sbi, является правильным (кроме того, что результат сложения указателя не является другим указателем — сложить два указателя просто невозможно, так как результат будет бессмысленным). - person Konrad Rudolph; 29.11.2010
comment
@Konrad Правда, оператор + нельзя переопределить для (char *, char *), и компилятор не позволяет добавлять указатель. Если бы это было возможно, это все равно было бы плохой идеей, потому что добавление этих двух указателей потребовало бы выделения для строки результата. Или он мог бы вернуть std::string, но это сделало бы STL гораздо более навязчивым, чем должно быть. - person Vincent Robert; 29.11.2010
comment
Кроме того, непосредственно соседние строковые литералы автоматически объединяются компилятором. std::string c = "Hello" "world";, например, приведет к c == "Helloworld". - person Fang; 20.01.2015
comment
Вы также можете использовать строковые литералы: std;:string c = "hello"s + "world"s; или просто сделать один из них std::string. - person Rakete1111; 08.10.2016

я бы сделал так:

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

Который компилируется в VS2008.

person graham.reeds    schedule 29.11.2010
comment
Также должно работать в gcc. - person graham.reeds; 29.11.2010

person    schedule
comment
Был бы +1, если бы у меня остались голоса! - person jwueller; 29.11.2010
comment
Извините, его С++, а не С# i += здесь не работает, для чего он используется - person Pratik; 01.12.2010
comment
@Pratik Вы уверены? - person Fraser; 17.07.2012