考虑以下类,其中包含std :: string类型的转换函数:
class SomeType
{
public:
SomeType(char *value)
{
_str = value;
}
operator std::string()
{
return std::string(_str);
}
private:
char *_str;
};
以下代码段无法使用错误进行编译:no运算符“==”匹配这些操作数
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 ==方法,但为什么转换函数不起作用?
解决方法
问题是std :: string实际上是一个模板,因此我想它的比较运算符也是一个模板.在这种情况下,我记得的标准规定,对于必需的参数,不会发生隐式转换,这意味着您必须将SomeType转换为自己的字符串以便调用它.
如有效C的第46项所述:
[…],because implicit type conversions are never considered during template argument deduction. Never. Such conversions are used during function calls,yes,but before you can call a function,you have to kNow which functions exist. […]
你可以找到更多信息here.