【问题标题】:std::string '+' : cannot add two pointersstd::string '+' : 不能添加两个指针
【发布时间】:2015-12-14 05:02:09
【问题描述】:

为什么要分配

std::string s="aaa"+1

工作正常,而

std::string s="aaa"+1+"bbb" 

得到错误Error 14 error C2110: '+' : cannot add two pointers

【问题讨论】:

  • 您必须记住"aaa"const char *const char * 可以加 1,但 const char * 加两个是什么意思?
  • 顺便说一句,第一行不是作业。这是调用构造函数的老式方式。

标签: c++ visual-c++ stdstring


【解决方案1】:

没有+ 运算符来连接 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&lt;&lt; 重载的类型。

【讨论】:

  • 只是挑剔:C 字符串并不是真正的指针,而是 const char[] 可以衰减到 const char*。并不是说它在这里真的很重要。
【解决方案2】:
std::string s="aaa"+1;

这只是编译,但很可能不会做你想做的事:它在 const char* 上加 1,文字 "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";

【讨论】:

    【解决方案3】:

    第一个有效,因为"abc" + 1 实际上是字符串"bc"(更改了实际字符串以便更容易看到)。这和做例如一样简单。

    char array[] = "abc;
    std::string str = &array[1];
    

    第二个不起作用,因为您不能以这种方式附加两个字符串文字。您需要确保其中一个已经是 std::string 对象。

    如果你想创建字符串"aaa1"那么我建议你看一下函数std::to_string

    【讨论】:

      【解决方案4】:

      这是在这种情况下的附加信息。 平均糟糕的男人解决方案是让它工作一半:

      void JTube::checkNode(ITCXMLNode current_node, char * tagName){
      
      if(!current_node.d)  {
            string s = "XML tag missing:";
            s = s +  tagName;
            exitreason(s);   
           }
         }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-13
        • 1970-01-01
        • 1970-01-01
        • 2020-12-18
        • 1970-01-01
        • 2022-01-25
        • 2021-04-08
        • 1970-01-01
        相关资源
        最近更新 更多