Как исправить "недопустимые операнды типов" const char "на двоичный" оператор + "?

Возможный дубликат:
Как объединить несколько строк C ++ в одну строку?

Согласно this, 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
да. Это работает для набора константных строк, которые я буду использовать в этом случае, но мне, вероятно, также понадобится то, что сказал Крис для случая 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, я бы действительно подумал о том, чтобы принять ответ Майкла. Это применимо к вашей ситуации намного лучше, чем это, поскольку все они буквальные. - 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
Как вам лучше использовать чертовские ресурсы? - person Michael Krelin - hacker; 05.10.2012
comment
Полезно иметь возможность комбинировать другие типы в строку, но я не думаю, что для этого нужно менять простую конкатенацию строк. Я думаю, что лучше использовать operator + и просто использовать 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
Майкл, лучше, если вам нужно объединить больше, чем строки и / или (с помощью std :: wostringstream) необходимо обрабатывать широкие строки символов и т. Д. Классы stringstream в STL были предоставлены специально для этого типа сценариев использования, расширяя парадигму iostreams . семантика std :: ostream для форматирования, точности, ширины и т. д. также может быть задействована здесь. - 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