簡體   English   中英

使用字符串中的構造函數從 const char[] 轉換為 class

[英]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::stringconst 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM