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

4

2 回答 2

8

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

如 Effective C++ 第 46 条所述:

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

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

于 2013-07-15T00:11:21.367 回答
4

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

没有operator ==得到只是std::string它的模板之一

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

但是这里不能推导出模板类型。您可以手动投射它:

if (static_cast<std::string>(a) == std::string("test")) 
于 2013-07-15T00:07:05.190 回答