错误:在c ++中从'const char [5]'转换为非标量类型

时间:2013-04-27 13:04:23

标签: c++ string

public:
    string str;

    Test(string& str){
        this->str=str;
        cout<<"constructor"<<endl;
    }


};

int main() {
    Test t="test";
    return 0;
}

为什么弹出“.. \ src \ Test.cpp:30:9:错误:从'const char [5]'转换为非标量类型'Test'请求 “?

但为什么跟随代码可以呢?

#include <iostream>
using namespace std;

class Test{

public:
    string str;

    Test(string str){
        this->str=str;
        cout<<"constructor"<<endl;
    }

    Test(const Test &test){
        cout<<"copy constructor"<<endl;
        this->str=test.str;
    }

};

int main() {
    Test t=Test("test");
    return 0;
}

4 个答案:

答案 0 :(得分:8)

Test t="test";

这试图:

  • 将字符串文字(字符数组char[5])转换为临时string
  • 将临时string转换为Test

这失败有两个原因:

  • 隐式转换序列不能涉及多个用户定义的转换。这里需要两个。
  • 临时无法绑定到非const 左值引用,这是您的转换构造函数Test(string&)想要的。

您的第二个示例通过以下方式解决了这些问题:

  • 明确地从string转换为TestTest(...)。现在只有一个隐式转换,从char[5]string。请注意,这是一种冗长的初始化方式; Test t("test")会做同样的事情。
  • 声明转换构造函数按值string取值,而不是引用。 const引用const string&也可以使用const char*

这两项修改都是必要的,因为每项修改只解决了两个问题中的一个。

答案 1 :(得分:1)

您只能在用户定义的类型之间进行一次隐式转换。您的代码具有从const char[6](衰退到const char*)到std::string以及从std::stringTest的隐式转换。这就是将签名更改为Test(const std::string&) will not work的原因。

尝试将构造函数签名更改为

#include <string>

struct Test
{
  Test(const char* c) : s_(c) {}
  std::string s_;
};

int main()
{
  Test t = "Hello";
}

答案 2 :(得分:0)

只需添加const即可接受"test"这是一个常量字面值:

Test(const string& str) : str(str) {
     ^^^^^
}

并像

一样使用它
Test t("test");

or

Test t = string("test");

Live code

答案 3 :(得分:0)

测试t =“测试”; 编译器将尝试找到一个construtor:Test(const char *), 但你只需要定义一个Test(字符串&amp;),这样就会弹出错误。

您可以尝试定义构造函数,例如Test(const char *)或修改您的代码,如下所示:Test t = string(“test”)