การเชื่อมสตริงไม่ทำงานตามที่คาดไว้ [ปิด]


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
ถ่าน * เป็นตัวชี้และไม่สามารถเพิ่มได้เพียงเพราะต้องการการจัดสรรหน่วยความจำ std :: strings ซ่อนการจัดสรรนี่คือเหตุผลว่าทำไมจึงเป็นไปได้ที่จะให้ตัวดำเนินการ + สำหรับพวกเขา
Vincent Robert

12
@Andry: เหตุผลนี้ไม่ได้ทำงานก็คือ C ++ อักษรสตริงที่สืบทอดจาก C ซึ่งเป็นเหตุผลที่พวกเขาเป็นประเภทที่มากกว่าconst char[] std::stringในอาร์เรย์ C (และใน C ++) จะสลายตัวเป็นพอยน์เตอร์ได้ง่ายมากซึ่งเป็นสาเหตุที่ "a" + "b" เรียกใช้ตัวดำเนินการในตัวที่เพิ่มตัวชี้สองตัว ผลลัพธ์ของสิ่งนั้น (ตัวชี้ที่ชี้ไปที่ใดที่หนึ่งในหน่วยความจำ) นั้นค่อนข้างไร้ประโยชน์ แต่อย่างไรก็ตามนี่คือสิ่งที่เราติดอยู่
sbi

2
@ แอนดรี้: สมเหตุสมผล แต่ผิด การจัดสรรไม่มีส่วนเกี่ยวข้องกับสิ่งนี้ คำอธิบายที่ให้โดย @sbi เป็นคำอธิบายที่ถูกต้อง (นอกเหนือจากข้อเท็จจริงที่ว่าผลลัพธ์ของการเพิ่มตัวชี้ไม่ใช่ตัวชี้อื่น - เป็นไปไม่ได้ที่จะเพิ่มตัวชี้สองตัวเนื่องจากผลลัพธ์จะไม่มีความหมาย)
Konrad Rudolph

1
นอกจากนี้ลิเทอรัลสตริงที่อยู่ติดกันโดยตรงจะถูกคอมไพเลอร์เชื่อมต่อกันโดยอัตโนมัติ ยกตัวอย่างเช่นจะส่งผลให้std::string c = "Hello" "world"; c == "Helloworld"
ฝาง

1
คุณยังสามารถใช้สตริงลิเทอรัล: std;:string c = "hello"s + "world"s;หรือสร้างเป็นstd::stringไฟล์.
Rakete1111



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.