std::string '+': невозможно добавить два указателя
Почему назначение
std::string s="aaa"+1
отлично работает пока
std::string s="aaa"+1+"bbb"
получает ошибку Error 14 error C2110: '+' : cannot add two pointers
3 ответа
Здесь нет +
оператор для конкатенации C строк. C строки просто указатели (const char *
), поэтому, если вы добавите к нему число, он просто увеличит этот указатель. После этого вы конвертируете его в строку C++:
std::string s = "aaa" + 1
|=======|
"aa"
const char *
|==============|
"aa"
std::string
Затем на втором шаге происходит сбой, когда вы пытаетесь объединить вторую строку, потому что, хотя добавление константы к указателю все же имело некоторый смысл (хотя и не в вашем случае), нет никакого способа добавить смысл двух указателей.
"aaa" + 1 + "bbb"
|========|
"aa"
const char *
|===|
const char *
Чтобы убедиться, что вы на самом деле объединяете и не суммируете указатели, я бы предложил использовать stringstream
, Это также гарантирует, что ваше постоянное число будет правильно преобразовано в string
,
std::stringstream ss;
ss << "aaa" << 1 << "bbb";
std::string s = ss.str();
Это будет работать для каждого типа, который имеет operator<<
перегружен.
std::string s="aaa"+1;
Это просто компилирует, но, скорее всего, не делает то, что вы хотите: он добавляет 1 к const char*
буквальный "aaa"
распадается и затем строит std::string
из этого указателя, в результате чего s == "aa"
,
Когда используешь operator+
для объединения строк, по крайней мере, один из операндов должен иметь тип std::string
другой может быть const char*
или что-то конвертируемое к этому. Например:
std::string s="aaa"+std::to_string(1);
или же
std::string s="aaa"+std::to_string(1)+"bbb";
Первый работает потому что "abc" + 1
на самом деле строка "bc"
(изменена фактическая строка, чтобы ее было легче увидеть). Это так же просто, как, например,
char array[] = "abc;
std::string str = &array[1];
Второй не работает, потому что вы не можете добавить два строковых литерала таким образом. Вы должны убедиться, что один из них уже std::string
объект.
Если вы хотите создать строку "aaa1"
тогда я предлагаю вам взглянуть на функцию std::to_string
,
Это дополнительная информация в этом контексте. Средне бедное решение человека состоит в том, чтобы сделать его наполовину рабочим:
void JTube::checkNode(ITCXMLNode current_node, char * tagName){
if(!current_node.d) {
string s = "XML tag missing:";
s = s + tagName;
exitreason(s);
}
}