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);   
     }
   }
Другие вопросы по тегам