拥有如下所示的代码。传递参数时遇到问题。
stringstream data;
char *addr=NULL;
strcpy(addr,retstring().c_str());
retstring()
是一个返回字符串的函数。
//more code
printfunc(num,addr,data.str().c_str());
我收到错误
从'const char *'无效转换为'char *'。
在函数的参数3上初始化'void Printfunc(int,char *,char *)'的参数3
在上面一行。该函数调用如下所示
void Printfunc(int a, char *loc, char *stream)
如果我需要更改任何初始化,请告诉我。
答案 0 :(得分:44)
好吧,data.str().c_str()
会产生char const*
,但您的函数Printfunc()
想要char*
。根据名称,它不会更改参数,只是打印它们和/或使用它们来命名文件,在这种情况下,您应该修改您的声明
void Printfunc(int a, char const* loc, char const* stream)
替代方案可能是将char const*
变为char*
,但最好修改声明:
Printfunc(num, addr, const_cast<char*>(data.str().c_str()));
答案 1 :(得分:13)
string::c.str()
返回const char *
类型的字符串here
快速解决方法:尝试投射printfunc(num,addr,(char *)data.str().c_str())
;
虽然上述内容可能有效,但它是未定义的行为,并且不安全。
这是使用模板的更好的解决方案:
char * my_argument = const_cast<char*> ( ...c_str() );
答案 2 :(得分:1)
首先是这段代码
char *addr=NULL;
strcpy(addr,retstring().c_str());
无效,因为您没有在要复制retstring()的地方分配内存.c_str()。
至于错误信息,那就足够清楚了。表达式data.str()。c_str()的类型是const char *,但函数的第三个参数声明为char *。您不能将const char *类型的对象分配给char *类型的对象。函数应该将第三个参数定义为const char *,如果它不改变第三个参数指向的对象,或者你可能不传递const char *类型的参数。