从 const char[] 到带有字符串构造函数的类

问题描述 投票:0回答:4

我尝试将字符串传递给函数而不是类

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
那样将字符串对象传递给
test(std::string("abc"))
。我需要从 const char* 转换它

c++ constructor type-conversion implicit-conversion
4个回答
2
投票

在一种类型到另一种类型的隐式转换序列中,有一条规则规定:最多只能应用一个用户定义的转换。在

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
是标准库的一部分,但它不是“内置”类型,而是库类型。这意味着它被视为用户定义的类型,即使它随您的实现一起提供。


0
投票

问题出在转换上。 “只能有一个”用户定义的转换。

这里是:

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

0
投票

问题是标准只允许直接隐式转换。

定义了以下转换:

const char*
->
std::string
const std::string
->
A

这意味着您可以安全地传递

const std::string
,其中需要
A
,但不能隐式转换为
std::string
对象。传递性在这里不起作用。

所以你必须这样做:

test(std::string("abc"));    // ok...

0
投票

导入像这样或等效的字符串文字声明:

using std::string_literals::operator""s;

(请参阅使用字符串文字而不使用命名空间 std)。

然后你可以像这样使用c++ std::stringliteral

"abc"s

test("abc"s);
© www.soinside.com 2019 - 2024. All rights reserved.