วิธีซ่อมแซม "ตัวถูกดำเนินการที่ไม่ถูกต้องประเภท 'const char' เป็นไบนารี 'ตัวดำเนินการ +' [ซ้ำ]

รายการซ้ำที่เป็นไปได้:
ฉันจะเชื่อมสตริง C++ หลายตัวเข้าด้วยกันในบรรทัดเดียวได้อย่างไร

ตามที่ สิ่งนี้ C++ std::string ถูกต่อเข้าด้วยกันโดยใช้ตัวดำเนินการ + เหตุใดจึงใช้รหัสนี้

using namespace std;
string sql = "create table m_table(" + 
    "path TEXT," +
    "quality REAL," +
    "found INTEGER);"; 

ทำให้เกิดข้อผิดพลาดนี้ใช่ไหม?

ตัวถูกดำเนินการที่ไม่ถูกต้องประเภท 'const char [22]' และ 'const char [17]' ถึงไบนารี 'operator+'


person jacknad    schedule 05.10.2012    source แหล่งที่มา
comment
สิ่งเหล่านั้นไม่ใช่วัตถุสตริง C ++ ที่คุณพยายามเชื่อมต่อ แต่เป็นสตริง C ตัวอักษรสตริงคือสตริง C   -  person Ben Voigt    schedule 05.10.2012


คำตอบ (3)


สิ่งที่คริสพูด แต่ในกรณีนี้คุณสามารถทำได้

string sql = "create table m_table("
    "path TEXT,"
    "quality REAL,"
    "found INTEGER);"; 

ซึ่งจะเชื่อมสตริง ในเวลาคอมไพล์

person Michael Krelin - hacker    schedule 05.10.2012
comment
ใช่. สิ่งนี้ใช้ได้กับชุดสตริง const ที่ฉันจะใช้ในกรณีนี้ แต่ฉันอาจต้องการสิ่งที่ Chris พูดสำหรับเคส insert into m_table ซึ่งมีตัวแปรและฉันละเลยที่จะพูดถึง - person jacknad; 05.10.2012
comment
@jacknad ตราบใดที่ตัวแปรเหล่านั้นเป็น std::strings คุณสามารถทำสิ่งที่ต้องการ string s = "abc" "def" + otherString + "ghi"; - person chris; 05.10.2012
comment
ไม่ได้แตะ C++ มาระยะหนึ่งแล้ว ระหว่าง C, Java, C#, Vala, Python ฯลฯ หัวของฉันกำลังหมุน แต่แต่ละคนก็มีเสน่ห์ของตัวเอง - person jacknad; 05.10.2012
comment
ใช่ นั่น + พิจารณาข้อความค้นหาที่มีพารามิเตอร์ - person Michael Krelin - hacker; 05.10.2012
comment
c++มีเสน่ห์ที่สุด! ;-) - person Michael Krelin - hacker; 05.10.2012

คุณต้องแปลงเป็นสตริงอย่างชัดเจนเพื่อให้ตรงกับรายการอาร์กิวเมนต์:

string sql = std::string("create table m_table(") + 
"path TEXT," +
"quality REAL," +
"found INTEGER);"; 

ตอนนี้อันแรกคือสตริงที่จับคู่กับ const char[N] ซึ่งตรงกับหนึ่งใน operator+ โอเวอร์โหลด และส่งคืน std::string ใหม่ ซึ่งใช้ในการทำซ้ำกระบวนการสำหรับส่วนที่เหลือ

person chris    schedule 05.10.2012
comment
+1 แต่ดูความคิดเห็นของฉันสำหรับกรณีเช่นนี้ - person Michael Krelin - hacker; 05.10.2012
comment
ขออภัยในความไม่รู้ของฉัน แต่คุณสามารถทำ std::string sql = /* String literals */ ได้ไหม? - person Bojangles; 05.10.2012
comment
@ MichaelKrelin-hacker ใช่เป็นจุดที่ดีมาก มักเกิดกรณีที่มีตัวแปร char * เป็นหนึ่งในสองอาร์กิวเมนต์แรก ซึ่งในกรณีนี้ คุณจะต้องแปลงตัวแปรหนึ่งอย่างชัดเจน แต่นั่นใช้ไม่ได้ที่นี่ - person chris; 05.10.2012
comment
@chris ใช่ นั่นคือเหตุผลที่ฉันพูดว่า สำหรับกรณีเช่นนี้ โดยเฉพาะอย่างยิ่งสำหรับ sql ฉันต้องการแบบสอบถามแบบมีพารามิเตอร์ ;) - person Michael Krelin - hacker; 05.10.2012
comment
@jacknad ฉันจะพิจารณายอมรับคำตอบของ Michael จริงๆ มันใช้ได้กับสถานการณ์ของคุณดีกว่านี้มากเนื่องจากเป็นตัวอักษรทั้งหมด - person chris; 05.10.2012

วิธีที่ดีกว่าคือใช้ std::ostringstream

#include <sstream>

const std::string myFunc(const std::string& s1, const std::string& s2)
{
  std::ostringstream os;
  os<<s1<<" "<<s2;
  return os.str();
}

ข้อดีคือคุณสามารถใช้ตัวดำเนินการ std::ostream ‹‹ โอเวอร์โหลดเพื่อสตริงค่าที่ไม่ใช่สตริงได้เช่นกัน

person mohaps    schedule 05.10.2012
comment
การทุ่มทรัพยากร heckuvalotta ดีกว่าอย่างไร - person Michael Krelin - hacker; 05.10.2012
comment
การรวมประเภทอื่นเข้ากับสตริงจะมีประโยชน์ แต่ฉันไม่คิดว่าไม่จำเป็นต้องเปลี่ยนการต่อสตริงอย่างง่ายเพื่อให้ได้สิ่งนั้น ฉันคิดว่าการใช้โอเปอเรเตอร์+ และการใช้ std::to_string() หรือฟังก์ชันที่คล้ายกันเป็นวิธีที่ดีกว่า: "hello" + std::to_string(50) lexical_cast ยังช่วยให้คุณทำสิ่งนี้กับประเภทใดก็ได้ที่มี ostream operator<<: "Hello, " + boost::lexical_cast<std::string>(myFoo) - person bames53; 05.10.2012
comment
Michael จะดีกว่าถ้าคุณต้องการเชื่อมต่อมากกว่าสตริงและ/หรือ (โดยใช้ std::wostringstream) จำเป็นต้องจัดการสตริงอักขระแบบกว้าง ฯลฯ คลาส stringstream ใน STL ได้รับการจัดเตรียมไว้โดยเฉพาะสำหรับ usecase ประเภทนี้ โดยขยายกระบวนทัศน์ iostreams . std::ostream semantics สำหรับการจัดรูปแบบ ความแม่นยำ ความกว้าง ฯลฯ ก็สามารถเข้ามามีบทบาทได้ที่นี่เช่นกัน - person mohaps; 06.10.2012
comment
@mohaps: ฉันจะหลีกเลี่ยงการใช้อักขระแบบกว้างที่กำหนดโดยการใช้งานที่น่ารำคาญ วิธีที่ดีที่สุดที่จะไม่มีโปรแกรมพกพา - person Matthieu M.; 06.10.2012
comment
@MatthieuM. สาธุ! :) แต่ในโค้ดเบสที่ใหญ่เพียงพอพร้อมกับไลบรารี่ของบุคคลที่สามที่น่ารำคาญเล็กๆ น้อยๆ... เป็นการดีกว่าที่จะวางแผนล่วงหน้าและยอมให้มีสิ่ง wchar_t ที่น่าสะพรึงกลัว - person mohaps; 06.10.2012
comment
@mohaps: การเขียนโปรแกรมสำหรับโลก linux เท่านั้นมันค่อนข้างหายากเพราะมันเป็น utf-8 ทุกที่ :D - person Matthieu M.; 06.10.2012
comment
ยังมี std::towstring อยู่นะ - person chris; 06.10.2012