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

84

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

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

#include <string>

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

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

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

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

Андри
источник
15
Ваш код должен компилироваться нормально, что означает, что вы не показываете точный код, вызывающий ошибку (помимо того, что не публикуете точное сообщение об ошибке).
sbi
Ну, это не работает ... Вероятно, моя вина в том, что я не предоставил компилятор ... это g ++, а не vc ... :)
Andry

Ответы:

153

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

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

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

std::string c = std::string("hello") + "world";
Конрад Рудольф
источник
3
char * является указателем и не может быть добавлен просто потому, что требует выделения памяти. std :: strings скрывают выделение, поэтому для них можно указать оператор +.
Винсент Роберт
12
@Andry: Причина, по которой это не работает, заключается в том, что C ++ наследует свои строковые литералы от C, поэтому они имеют тип const char[], а не std::string. В C (а, следовательно, и в C ++) массивы очень легко распадаются на указатели, поэтому «a» + «b» вызовет встроенный оператор, который добавляет два указателя. Результат этого (указатель, указывающий куда-то в память), конечно, совершенно бесполезен, но, тем не менее, это то, с чем мы застряли.
sbi
2
@Andry: разумно, но неправильно. Распределение тут ни при чем. Объяснение, данное @sbi, является правильным (не считая того факта, что результат добавления указателя не является другим указателем - добавить два указателя просто невозможно, так как результат будет бессмысленным).
Конрад Рудольф
1
Кроме того, непосредственно смежные строковые литералы автоматически объединяются компилятором. std::string c = "Hello" "world";, например, приведет к c == "Helloworld".
Fang
1
Вы также можете использовать строковые литералы: std;:string c = "hello"s + "world"s;или просто сделать один из них std::string.
Rakete1111 08
46
std::string a = "Hello ";
a += "World";
Svisstack
источник
2
Было бы +1, если бы у меня остались голоса за!
jwueller
Извините, его C ++, а не C # i + = здесь не работает, для чего он используется
Pratik
18
@Pratik Ты уверен?
Fraser
5

Я бы сделал это:

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

Что компилируется в VS2008.

graham.reeds
источник
1
Также должен работать в gcc.
graham.reeds
5
std::string a = "Hello ";
std::string b = "World ";
std::string c = a;
c.append(b);
Теодор Припое
источник