Bagaimana cara memperbaiki "operan tipe 'const char' yang tidak valid ke biner 'operator+'? [duplikat]

Kemungkinan Duplikat:
Bagaimana cara menggabungkan beberapa string C++ dalam satu baris?

Menurut ini C++ std::string digabungkan dengan menggunakan operator+. Lalu mengapa kode ini

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

menyebabkan kesalahan ini?

operan tipe 'const char [22]' dan 'const char [17]' tidak valid ke biner 'operator+'


person jacknad    schedule 05.10.2012    source sumber
comment
Itu bukan objek string C++ yang Anda coba gabungkan, tetapi string C. String literal adalah string C.   -  person Ben Voigt    schedule 05.10.2012


Jawaban (3)


Apa yang Chris katakan, tetapi dalam kasus khusus ini Anda bisa melakukannya

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

Yang akan menggabungkan string pada waktu kompilasi.

person Michael Krelin - hacker    schedule 05.10.2012
comment
Ya. Ini berfungsi untuk satu set string const yang akan saya gunakan dalam kasus ini tetapi saya mungkin juga memerlukan apa yang dikatakan Chris untuk kasus insert into m_table yang memiliki variabel dan yang tidak saya sebutkan. - person jacknad; 05.10.2012
comment
@jacknad, Selama variabel tersebut std::strings, Anda dapat melakukan sesuatu seperti string s = "abc" "def" + otherString + "ghi"; - person chris; 05.10.2012
comment
Sudah lama tidak menyentuh C++. Antara C, Java, C#, Vala, Python, dll., kepalaku berputar. Namun masing-masing memiliki daya tarik tersendiri. - person jacknad; 05.10.2012
comment
Ya, itu + mempertimbangkan kueri berparametri. - person Michael Krelin - hacker; 05.10.2012
comment
c++ adalah yang paling menawan! ;-) - person Michael Krelin - hacker; 05.10.2012

Anda perlu mengonversinya secara eksplisit menjadi string agar sesuai dengan daftar argumen:

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

Sekarang yang pertama adalah string yang cocok dengan const char[N], yang cocok dengan salah satu dari operator+ kelebihan beban dan mengembalikan std::string baru, yang digunakan untuk mengulangi proses sisanya.

person chris    schedule 05.10.2012
comment
+1 tetapi lihat komentar saya untuk kasus seperti ini. - person Michael Krelin - hacker; 05.10.2012
comment
Maafkan ketidaktahuan saya, tetapi bisakah Anda melakukan std::string sql = /* String literals */? - person Bojangles; 05.10.2012
comment
@MichaelKrelin-hacker, Ya, poin yang sangat bagus. Sering kali terdapat variabel char * sebagai salah satu dari dua argumen pertama, dalam hal ini Anda perlu mengonversi salah satunya secara eksplisit, namun hal tersebut tidak berlaku di sini. - person chris; 05.10.2012
comment
@chris, ya makanya saya bilang untuk kasus seperti ini. Khususnya, untuk sql saya lebih suka kueri berparametri;) - person Michael Krelin - hacker; 05.10.2012
comment
@jacknad, saya benar-benar mempertimbangkan untuk menerima jawaban Michael. Ini berlaku jauh lebih baik pada situasi Anda daripada ini karena semuanya literal. - person chris; 05.10.2012

cara yang lebih baik adalah dengan menggunakan 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();
}

Keuntungannya adalah Anda dapat menggunakan kelebihan operator std::ostream ‹‹ untuk merangkai nilai non string juga

person mohaps    schedule 05.10.2012
comment
Bagaimana cara menggunakan sumber daya heckuvalotta dengan lebih baik? - person Michael Krelin - hacker; 05.10.2012
comment
Memang berguna untuk bisa menggabungkan tipe lain ke dalam sebuah string, tapi menurut saya tidak perlu mengubah rangkaian string sederhana untuk mendapatkannya. Saya pikir tetap menggunakan operator+ dan hanya menggunakan std::to_string() atau fungsi serupa adalah cara yang lebih baik: "hello" + std::to_string(50). lexical_cast bahkan memungkinkan Anda melakukan ini dengan tipe apa pun yang memiliki ostream operator<<: "Hello, " + boost::lexical_cast<std::string>(myFoo) - person bames53; 05.10.2012
comment
Michael, lebih baik jika Anda perlu menggabungkan lebih dari string dan/atau (dengan menggunakan std::wostringstream) perlu menangani string karakter lebar, dll. kelas stringstream di STL disediakan khusus untuk jenis kasus penggunaan ini, memperluas paradigma iostreams . std::ostream semantik untuk pemformatan, presisi, lebar, dll. juga dapat berperan di sini. - person mohaps; 06.10.2012
comment
@mohaps: baiklah, saya akan menghindari penggunaan karakter lebar yang ditentukan oleh implementasi yang mengganggu; cara terbaik untuk tidak memiliki program portabel. - person Matthieu M.; 06.10.2012
comment
@MatthieuM. Amin untuk itu! :) Namun dalam basis kode yang cukup besar dengan perpustakaan pihak ketiga lama yang mengganggu... lebih baik membuat rencana ke depan dan mengizinkan hal-hal wchar_t yang ditakuti. - person mohaps; 06.10.2012
comment
@mohaps: ya, pemrograman hanya untuk dunia linux, cukup jarang karena utf-8 ada di mana-mana :D - person Matthieu M.; 06.10.2012
comment
Ngomong-ngomong, masih ada std::towstring. - person chris; 06.10.2012