[英]Conversion from const char[] to class with constructor from string
我嘗試將字符串傳遞給 function 而不是 class A
的 object ,但出現錯誤。 為什么它不工作,我怎樣才能讓它工作?
#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;
}
我不想傳遞一個字符串 object 來test
test(std::string("abc"))
。 我需要從 const char[] 轉換它
在一種類型到另一種類型的 隱式轉換序列中,有一條規則規定:最多只能應用一個用戶定義的轉換。 在
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
object。 傳遞性在這里不起作用。
所以你必須這樣做:
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
另一種方法是添加function:
void test(const std::string& s)
{
test(A(s)) ;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.