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