为什么转换函数不能与std :: string一起使用?

时间:2013-07-14 23:56:49

标签: c++

考虑以下类,其中包含std :: string类型的转换函数:

class SomeType
{
    public:

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

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

    private:
    char *_str;
};

以下代码段无法编译并显示错误:no operator“==”匹配这些操作数

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 ==方法,但为什么转换函数不起作用?

2 个答案:

答案 0 :(得分:8)

问题是std :: string实际上是一个模板,因此我想它的比较运算符也是一个模板。在这种情况下,我记得的标准规定,对于必需的参数,不会发生隐式转换,这意味着您必须将SomeType转换为字符串,以便调用它。

正如有效C ++第46项所述:

  

[...],因为在模板参数推导期间从不考虑隐式类型转换。决不。在函数调用期间使用此类转换,是的,但在调用函数之前,您必须知道存在哪些函数。 [...]

您可以找到更多信息here

答案 1 :(得分:4)

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"))