我在下面有这个代码,我在编译时遇到错误:
error: cannot convert 'const char*' to 'std::string*' for argument '1' to 'void sillyFunction(std::string*, int)'
#include <iostream>
#include <string>
using namespace std;
int counter = 0;
void sillyFunction(string * str, int cool=0);
int main(){
sillyFunction("Cool");
sillyFunction("Cooler", 1);
return 0;
}
void sillyFunction(string * str, int cool){
counter++;
if (cool){
for (int i=0; i<counter; i++) cout << *str << endl;
} else {
cout << *str << endl;
}
}
答案 0 :(得分:13)
请勿将您的参数作为string *
尝试使用const string &
代替
编辑:
std::string
和const char*
是不同的类型。 std::string
已经从字符串文字(例如:"Cool"
)转换为实际的字符串对象。因此,通过传入字符串文字"Cool"
,您在某种意义上传递std::string
对象,而不是指向一个对象。
我选择使用const string &
的原因主要来自个人编码实践。这样可以最大限度地减少堆栈内存使用量,并且由于传入的是常量字符串文字,因此无需修改参数。
另外请不要忘记,如果您更改string *
,则不再需要在cout
中取消引用它:
if (cool){
for (int i=0; i<counter; i++) cout << str << endl;
} else {
cout << str << endl;
}
答案 1 :(得分:3)
变化
void sillyFunction(string * str, int cool){
counter++;
if (cool){
for (int i=0; i<counter; i++) cout << *str << endl;
} else {
cout << *str << endl;
}
}
到
void sillyFunction(const char* str, int cool){
counter++;
if (cool){
for (int i=0; i<counter; i++) cout << str << endl;
} else {
cout << str << endl;
}
}
答案 2 :(得分:2)
解释实际的问题 ...
虽然编译器会愉快地安排char *
/ C-string通过适当的std::string
构造函数“转换”为std::string
,但这不是你要求的
您已向现有 std::string
对象请求指针。根据定义,传递给您的函数的内容必须是已存在的 std::string
(或后代)对象的地址。
您必须将指针理解为不同的类型 - 您的函数需要pointer-to-std::string
“对象”。虽然可以通过指向std::string
的指针访问std::string
,但指针本身不 a std::string
,也不能“转换”为std::string
1}},也不能将其视为指向char的指针(反之亦然)。
最简单的替代方案确实是对std::string
(const std::string &
)的const引用。 const,在这种情况下,因为你没有做任何修改字符串的事情。如果你是,那将是另一回事,你必须仔细考虑你是否打算让来电者看到你的变化。
通过这样做,你说你想要一个std::string
对象(记住,对象的引用就是那个对象,特别是C++ FAQ 8.5),允许编译器调用相应的构造函数,以便在使用char *
(const或不是const)调用函数时为您创建std :: string。
同时,如果有人通过了实际 std::string
,则会避免使用构造函数,并且您获得与pointer-to-std::string
相同的效率。双赢。
或者,当然,您可以采用普通std::string
,但在这种情况下,您总是获取传入的字符串的副本,无论它是C字符串还是一个std::string
。有时这是可取的,有时不是。在您的情况下,除了打印出字符串之外,您不会做任何事情,从而不需要开销。
答案 3 :(得分:1)
您可以通过将原型更改为:
来实现这一目标void sillyFunction(string const &str, int cool=0);
char const *
可以隐式转换为临时std::string
,而后者又可以通过引用(std::string const &
)传递。没有隐式转换为指针(std::string *
),这就是你得到错误的原因。
答案 4 :(得分:1)
您可以从const char *
转换为string
,但不能转换为string *
。
也许您希望sillyFunction
采用const引用?
void sillyFunction(const string &str, int cool){
counter++;
if (cool){
for (int i=0; i<counter; i++) cout << str << endl;
} else {
cout << str << endl;
}
}
答案 5 :(得分:1)
应该是
void sillyFunction(const string& str, int cool=0);
答案 6 :(得分:1)
如果要为函数使用指针,则必须在某处声明字符串。需要分配内存。所以要么声明一个变量,要么调用new来为字符串创建内存。
int main(){
string str = "Cool";
string str2 = "Cooler";
sillyFunction(&str);
sillyFunction(&str2, 1);
return 0;
}
答案 7 :(得分:0)
我使用字符串副本
得到了一个不同的简单解决方案char s [20] strcpy(s,const char * p);
十,你在s中得到了* p的字符串指针... 它有效..