考虑以下类,其中包含std :: string类型的转换函数:
class SomeType
{
public:
SomeType(char *value)
{
_str = value;
}
operator std::string()
{
return std::string(_str);
}
private:
char *_str;
};
以下代码段无法编译并显示错误:no operator“==”匹配这些操作数
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 ==方法,但为什么转换函数不起作用?
答案 0 :(得分:8)
问题是std :: string实际上是一个模板,因此我想它的比较运算符也是一个模板。在这种情况下,我记得的标准规定,对于必需的参数,不会发生隐式转换,这意味着您必须将SomeType转换为字符串,以便调用它。
正如有效C ++第46项所述:
[...],因为在模板参数推导期间从不考虑隐式类型转换。决不。在函数调用期间使用此类转换,是的,但在调用函数之前,您必须知道存在哪些函数。 [...]
您可以找到更多信息here。
答案 1 :(得分:4)
std::string
实际上是std::basic_string<char, i_do_not_remember>
没有operator ==
只获得std::string
它是模板一p>
template<...>
bool operator (basic_string<...>& a, basic_string<...>& b) {
//
}
但是这里不能推断出模板类型。您可以手动投射:
if (static_cast<std::string>(a) == std::string("test"))