【问题标题】:cannot convert parameter from `const char *` to `char *`无法将参数从 `const char *` 转换为 `char *`
【发布时间】:2015-06-20 12:21:24
【问题描述】:

鉴于此代码:

void group::build(int size, std::string *ips){
/*Build the LL after receiving the 
member list from bootstrap*/
head = new member("head");
member *temp1,*temp2;

temp1 = new member(ips[0].data());  // error here
    // ....
}

member::member(char *ip){
strcpy_s(this->ip_addr,sizeof(ip),ip);
this->next = NULL;
this->previous = NULL;
}

而指向字符串的指针定义为:

std::string *ips;

我想用字符串初始化数组ips,但是当我尝试从任何数组成员获取 char 数据时出现错误:

无法将参数从const char * 转换为char *

为什么?

【问题讨论】:

  • strcpy_s 的使用是错误的。首先,第二个参数是目标缓冲区的大小,但您没有提供。其次,sizeof(ip)char*的字节大小,与字符串长度无关。

标签: c++ string


【解决方案1】:

您正在调用的函数需要一个指向可修改缓冲区的指针,char*。您正在传递一个指向不可修改缓冲区的指针,const char*

由于您的 member 函数不会修改其输入,您应该更改其声明以接收 const char*

member::member(const char *ip)

【讨论】:

    【解决方案2】:

    换行

    member::member(char *ip)
    

    member::member(const char *ip)
    

    而且,我不确定您对 strcpy_s 的使用情况

    【讨论】:

      【解决方案3】:

      好吧,data() 返回一个const char*,因此出现了错误。您应该更改member::member 以接收const char*,因为无论如何您都在复制它的值。

      另外,请注意sizeof(ip) 等于sizeof(char*),这只是一个指针的大小。您应该传递 this->ip_addr 缓冲区的大小。

      【讨论】:

        【解决方案4】:

        因为 member::member 被定义为将 char * 作为参数,而 string.data() 将 const char * 作为值(因为它返回对自己内部存储器的引用)。您可以使用 const_cast 或更改 member::member 方法签名。

        【讨论】:

          【解决方案5】:

          改变这个:

          member::member(char *ip)
          

          到这里

          member::member(const char *ip)
          

          也就是说,你要改变构造函数的参数类型。


          或者,这也是一个更好的解决方案,只需将参数const std::string &

          member::member(const std::string &)
          

          这种方法可以使用std::string 类提供的更好的接口。这些接口比strcpystrlenstrcat等C字符串接口要好很多。

          【讨论】:

            【解决方案6】:

            std::string 数据有这个签名

            const char* data() const;
            

            您正在尝试调用需要 char * 的成员 c'tor,所以这是您的错误。

            改变这个:member::member(char *ip)

            对此:member::member(const char *ip)

            【讨论】:

              猜你喜欢
              • 2018-11-16
              • 1970-01-01
              • 1970-01-01
              • 2017-05-14
              • 1970-01-01
              • 2011-07-25
              • 1970-01-01
              • 1970-01-01
              • 2014-03-02
              相关资源
              最近更新 更多