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;
}
答案 0 :(得分:8)
Test t="test";
这试图:
char[5]
)转换为临时string
string
转换为Test
这失败有两个原因:
Test(string&)
想要的。您的第二个示例通过以下方式解决了这些问题:
string
转换为Test
,Test(...)
。现在只有一个隐式转换,从char[5]
到string
。请注意,这是一种冗长的初始化方式; Test t("test")
会做同样的事情。string
取值,而不是引用。 const引用const string&
也可以使用const char*
。这两项修改都是必要的,因为每项修改只解决了两个问题中的一个。
答案 1 :(得分:1)
您只能在用户定义的类型之间进行一次隐式转换。您的代码具有从const char[6]
(衰退到const char*
)到std::string
以及从std::string
到Test
的隐式转换。这就是将签名更改为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");
答案 3 :(得分:0)
测试t =“测试”; 编译器将尝试找到一个construtor:Test(const char *), 但你只需要定义一个Test(字符串&amp;),这样就会弹出错误。
您可以尝试定义构造函数,例如Test(const char *)或修改您的代码,如下所示:Test t = string(“test”)