C ++无法将'const char *'转换为'std :: string *'

时间:2011-05-13 13:55:03

标签: c++ string stl

我在下面有这个代码,我在编译时遇到错误:

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;
    }
}

8 个答案:

答案 0 :(得分:13)

请勿将您的参数作为string *尝试使用const string &代替

编辑:

std::stringconst 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::stringconst 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的字符串指针... 它有效..