通常你可以比较字符串..
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 { ... };
与数字的比较工作正常,我不需要实现==等等.....
答案 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
}
它汇编得很好。