Об’єднання рядків не працює належним чином [закрито]


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 ... :)
Андрі

Відповіді:


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;або просто зробити один із них a std::string.
Rakete1111


5

Я б зробив це:

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

Яка компілюється у VS2008.


1
Також повинен працювати в gcc.
graham.reeds

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.