3

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

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 { ... };

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

4

2 回答 2

6

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

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

于 2012-09-11T14:42:27.927 回答
2

转换不起作用,因为字符串的 operator == 是模板化运算符(函数模板),而不是重载(例如,参见http://en.cppreference.com/w/cpp/string/basic_string/operator_cmp运算符 == 声明)。

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

#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
}

它编译得很好。

于 2012-09-13T14:36:08.363 回答