簡體   English   中英

為什么轉換函數不能與std :: string一起使用?

[英]Why doesn't a conversion function work with std::string?

考慮以下類,其中包含std :: string類型的轉換函數:

class SomeType
{
    public:

    SomeType(char *value)
    {
        _str = value;
    }

    operator std::string()
    {
        return std::string(_str);
    }

    private:
    char *_str;
};

以下代碼段無法使用錯誤進行編譯:no運算符“==”匹配這些操作數

int main(int argc, char* argv[])
{
    SomeType a("test");

    if (a == std::string("test")) // ERROR on this line
    {
        int debug = 1;
    }

    return 0;
}

我意識到我可以定義一個接受std :: string操作數的operator ==方法,但為什么轉換函數不起作用?

問題是std :: string實際上是一個模板,因此我想它的比較運算符也是一個模板。 在這種情況下,我記得的標准規定,對於必需的參數,不會發生隱式轉換,這意味着您必須將SomeType轉換為自己的字符串以便調用它。

如Effective C ++第46項所述:

[...],因為在模板參數推斷期間從不考慮隱式類型轉換。 決不。 在函數調用期間使用此類轉換,是的,但在調用函數之前,您必須知道存在哪些函數。 [...]

你可以在這里找到更多信息。

std::string實際上是std::basic_string<char, i_do_not_remember> typedef

沒有operator ==只得到std::string它是模板一

template<...>
bool operator (basic_string<...>& a, basic_string<...>& b) {
    //
}

但是這里不能推斷出模板類型。 您可以手動投射:

if (static_cast<std::string>(a) == std::string("test")) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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