使用来自字符串的构造函数从 const char[] 转换为 class
Conversion from const char[] to class with constructor from string
我尝试将字符串传递给函数而不是 class A
的对象,但出现错误。
为什么它不起作用,我怎样才能让它起作用?
#include <string>
class A {
public:
A(const std::string &str) {
}
};
void test(const A &a) {
}
int main()
{
A a("abc"); //it's ok
test(a); //it's ok
test("abc"); //error?
return 0;
}
我不想像 test(std::string("abc"))
那样将字符串对象传递给 test
。我需要将它从 const char[]
在从一种类型到另一种类型的 implicit conversion 序列中,有一条规则规定:最多只能应用一个用户定义的转换。在
test("abc");
您需要两个用户定义的转换。首先,您需要将 const char[N]
转换为 std::string
,这被认为是用户定义的转换 1。然后您需要将 std::string
转换为 A
,这将是第二个用户定义的转换。这就是你得到错误的原因
要修复,您可以使用
test(A("abc"));
//or
test(std::string("abc"));
现在您有一个显式用户定义转换和一个隐式转换,满足一个隐式转换规则。
您还可以为 A
提供接受 const char*
的构造函数,以便您可以直接从 "abc"
转换为 A
。
1:尽管 std::string
是标准库的一部分,但它不是“内置”类型,而是库类型。这意味着它被视为用户定义的类型,即使它随您的实现一起提供。
问题是标准只允许直接隐式转换。
定义了以下转换:const char*
-> std::string
和 const std::string
-> A
这意味着您可以安全地传递一个 const std::string
,其中需要一个 A
,但不能隐式转换为 std::string
对象。传递性在这里不起作用。
所以你必须做:
test(std::string("abc")); // ok...
问题出在转换上。 “只能有一个”用户定义的转换。
这里是:
const char * -> std::string -> A
所以您需要移除一个转化。
修复它的一种方法是在字符串末尾添加后缀 's' :
test("ABC"s);
https://en.cppreference.com/w/cpp/string/basic_string/operator%22%22s
另一种方法是添加函数:
void test(const std::string& s)
{
test(A(s)) ;
}
我尝试将字符串传递给函数而不是 class A
的对象,但出现错误。
为什么它不起作用,我怎样才能让它起作用?
#include <string>
class A {
public:
A(const std::string &str) {
}
};
void test(const A &a) {
}
int main()
{
A a("abc"); //it's ok
test(a); //it's ok
test("abc"); //error?
return 0;
}
我不想像 test(std::string("abc"))
那样将字符串对象传递给 test
。我需要将它从 const char[]
在从一种类型到另一种类型的 implicit conversion 序列中,有一条规则规定:最多只能应用一个用户定义的转换。在
test("abc");
您需要两个用户定义的转换。首先,您需要将 const char[N]
转换为 std::string
,这被认为是用户定义的转换 1。然后您需要将 std::string
转换为 A
,这将是第二个用户定义的转换。这就是你得到错误的原因
要修复,您可以使用
test(A("abc"));
//or
test(std::string("abc"));
现在您有一个显式用户定义转换和一个隐式转换,满足一个隐式转换规则。
您还可以为 A
提供接受 const char*
的构造函数,以便您可以直接从 "abc"
转换为 A
。
1:尽管 std::string
是标准库的一部分,但它不是“内置”类型,而是库类型。这意味着它被视为用户定义的类型,即使它随您的实现一起提供。
问题是标准只允许直接隐式转换。
定义了以下转换:const char*
-> std::string
和 const std::string
-> A
这意味着您可以安全地传递一个 const std::string
,其中需要一个 A
,但不能隐式转换为 std::string
对象。传递性在这里不起作用。
所以你必须做:
test(std::string("abc")); // ok...
问题出在转换上。 “只能有一个”用户定义的转换。
这里是:
const char * -> std::string -> A
所以您需要移除一个转化。 修复它的一种方法是在字符串末尾添加后缀 's' :
test("ABC"s);
https://en.cppreference.com/w/cpp/string/basic_string/operator%22%22s
另一种方法是添加函数:
void test(const std::string& s)
{
test(A(s)) ;
}