C++模糊重载问题

SSi*_*ht3 1 c++ overloading

我有一个名为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;
}
Run Code Online (Sandbox Code Playgroud)

如果我使用'char string'调用WriteAmount,它会报告一个歧义错误 - 说它在char字符串的WriteAmount和std :: string的WriteAmount之间混淆.我知道引擎盖下发生了什么 - 它试图使用std :: string构造函数隐式地将char字符串转换为std :: string.但我不希望在WriteAmount的实例中发生这种情况(IE我不希望在函数内发生任何隐式转换 - 假设每个角色都针对每个角色进行了优化).

我的问题是,为了保持一致性,不改变函数格式(IE不改变参数的数量或它们出现的顺序)并且不改变标准库,无论如何都要防止有问题的函数中的隐式转换?

我忘了添加,最好没有类型转换,因为这对函数调用来说很乏味而且不是用户友好的.

Joh*_*itb 5

你得到的含糊不清是因为你的第二个参数是不同的.尝试调用它long x = ...; WriteAmount("foo", x)会引起歧义,因为它与第一个重载更好地匹配第二个参数,但第一个参数与第二个重载匹配得更好.

在这两种情况下使第二个参数具有相同的类型,你将摆脱歧义,因为第二个参数对于两个重载都匹配同样更差/更好,并且第一个参数将与第二个重载更好地匹配.