我有一个名为FileProc的类,它运行文件IO操作。在一个实例中,我已经声明了两个函数(它们是operator = functions的子函数),两者都是决定性的不同:
const bool WriteAmount(const std::string &Arr, const long S)
{
/* Do some string conversion */
return true;
}
const bool WriteAmount(const char Arr[], unsigned int S)
{
/* Do some string conversion */
return true;
}
如果我使用'char string'调用WriteAmount,它会报告一个歧义错误 - 说它在char字符串的WriteAmount和std :: string的WriteAmount之间混淆。我知道引擎盖下发生了什么 - 它试图使用std :: string构造函数隐式地将char字符串转换为std :: string。但我不希望在WriteAmount的实例中发生这种情况(IE我不希望在函数中发生任何隐式转换 - 假设每个角色都针对每个角色进行了优化)。
我的问题是,为了保持一致性,不改变函数格式(IE不改变参数的数量或它们出现的顺序)并且不改变标准库,无论如何都要防止有问题的函数中的隐式转换? / p>
我忘了添加,最好没有类型转换,因为这对函数调用来说会很乏味,而且不是用户友好的。
答案 0 :(得分:5)
你得到歧义,因为你的第二个参数是不同的。试图用long x = ...; WriteAmount("foo", x)
调用它会引起歧义,因为它与第一个重载更好地匹配第二个参数,但第一个参数与第二个重载匹配得更好。
使第二个参数在两种情况下具有相同的类型,你将摆脱歧义,因为第二个参数匹配同样更差/好两个重载,并且第一个参数将更好地匹配第二个重载
答案 1 :(得分:0)
你不能改变第二个参数并将其转换为unsigned int吗?它不应该能够使用第一个函数调用。我没有用C ++编写很长时间..