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

6
请考虑下面这个类,它包含了一个用于 std::string 类型的转换函数:
class SomeType
{
    public:

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

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

    private:
    char *_str;
};

以下代码片段无法编译,报错信息为:没有匹配这些操作数的运算符“==”。
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==方法,但是为什么转换函数不起作用呢?


1
@Aniket 错误在问题中。 - Konrad Rudolph
如果这些答案中有任何一个对您有帮助,请接受其中一个。 - Borgleader
2个回答

8
问题在于std::string实际上是一个模板,因此我想它的比较运算符也是一个模板。在这种情况下,标准规定所需参数不会进行任何隐式转换,这意味着您必须自己将SomeType转换为string才能调用它。
正如Effective C++中的第46条所述:
[...],因为在模板参数推导期间永远不考虑隐式类型转换。从来没有。这样的转换在函数调用时使用,但在调用函数之前,您必须知道哪些函数存在。 [...]
您可以在此处找到更多信息。

4

std::string实际上是std::basic_string<char, i_do_not_remember>的typedef。

没有只能用于std::stringoperator ==,它是模板函数。

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

但是模板类型在这里无法被推导。您可以手动进行转换:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接