鉴于此代码:
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 *
为什么?
答案 0 :(得分:3)
您正在调用的函数需要一个指向可修改缓冲区char*
的指针。您正在将指针传递给不可修改的缓冲区const char*
。
由于您的member
函数未修改其输入,因此您应更改其声明以接收const char*
。
member::member(const char *ip)
答案 1 :(得分:1)
好吧,data()
会返回const char*
,因此会出错。您应该更改member::member
以接收const char*
,因为您正在复制其值。
另请注意,sizeof(ip)
等于sizeof(char*)
,这只是指针的大小。您应该改为传递this->ip_addr
缓冲区的大小。
答案 2 :(得分:1)
因为member :: member被定义为将char *作为参数,而string.data()将const char *作为一个值(因为它返回对它自己的内部存储器的引用)。您可以使用const_cast或更改member :: member方法签名。
答案 3 :(得分:1)
改变这个:
member::member(char *ip)
到这个
member::member(const char *ip)
也就是说,你要改变构造函数的参数类型。
或者,这也是一个更好的解决方案,只需创建参数const std::string &
:
member::member(const std::string &)
这种方法允许使用std::string
类提供的更好的接口。这些接口比C-string接口要好得多,例如strcpy
,strlen
,strcat
等。
答案 4 :(得分:1)
std :: string数据具有此签名
const char* data() const;
你试图调用成员c'tor,期望char *所以这是你的错误。
更改此内容:member::member(char *ip)
对此:member::member(const char *ip)
答案 5 :(得分:0)
更改行
member::member(char *ip)
到
member::member(const char *ip)
并且,我不确定您对strcpy_s