与用户构建字符串类型的字符串比较

时间:2012-09-11 14:18:26

标签: c++

通常你可以比较字符串..

if (var1 == "a string") ...

但是当我用转换运算符声明我自己的类时,就像这样:

class my_type {
   operator std::string() const { ... };
   ....
}

现在这个:

 std::string var1("a string");
 my_type x("a string");
 if (x == "a string") ....
 if (x == var1) ....

不起作用..即......

error: no match for ‘operator==’ 

当然这有效:

 if ((std::string) x == var1) ....

但是我希望它能够在没有明确投射的情况下发生。 为什么c ++不将my_type转换为字符串进行比较.. 如何强制它执行此操作而无需实现“==”运算符本身? 其他比较运算符也是如此。

谢谢

PS>顺便说一句,如果我实现将my_type转换为数字的运算符(对我的类型来说可以)...就像:

 operator double() const { ... };

与数字的比较工作正常,我不需要实现==等等.....

2 个答案:

答案 0 :(得分:6)

正如here所指出的,这不是关于隐式转换,而是operator ==对字符串的行为。

但我建议您为您的班级重载operator ==,而不是依赖隐式转换。

答案 1 :(得分:2)

转换不起作用,因为operator == for strings是模板化运算符(函数模板),而不是重载(例如,参见{= 3}}对于operator ==声明)。

对于函数模板,参数类型必须与参数完全匹配(没有任何隐式转换)。 为了说明差异,让我们引入一个重载<<字符串上的运算符:

#include <string>

struct X
{
    operator std::string() {return "X";}
};


std::string operator << (std::string const& s1, std::string const& s2)
{
  return s1+s2;
}

int main()
{
    X x;
    x<<std::string("bla"); // compiles fine
}

它汇编得很好。