C函数重载类似转换

我收到一个错误,说两个重载有类似的转换.我尝试了太多东西但没有帮助.

这是一段代码

CString GetInput(int numberOfInput, BOOL clearBuffer = FALSE, UINT timeout = INPUT_TIMEOUT);
CString GetInput(int numberOfInput, string szTerminationPattern, BOOL clearBuffer = FALSE, UINT timeout = INPUT_TIMEOUT);

我无法理解串怎么可能等于长?

我正在使用Visual C 6(是的,我知道它已经老了,我正在研究遗留代码,所以我很无奈)

编辑:触发错误的代码行是

l_szOption = GetInput(13, FALSE, 30 * 10);

解决方法:

问题是由于您将超时参数作为有符号整数值提供,必须将其转换为函数的第一个版本的无符号整数(因为timeout参数声明为UINT).

即函数的第一个版本需要转换第三个参数,而函数的第二个版本需要转换第二个参数(FALSE,它只是0,转换为字符串).在这种情况下,两个函数都不比另一个好,并且重载决策失败.

尝试显式赋予第三个参数无符号类型

l_szOption = GetInput(13, FALSE, 30U * 10);

要么

l_szOption = GetInput(13, FALSE, (UINT) 30 * 10);

(无论你喜欢哪个)代码应按预期编译.

换句话说,编译器抱怨你的代码是绝对正确的.你的代码确实破了.代码中的问题与下面的简单示例具有完全相同的性质

void foo(int i, unsigned j);
void foo(unsigned i, int j);

int main() {
  foo(0, 0);
}

由于完全相同的原因,此代码也无法编译.

上一篇:c – 编译器没有选择歧义


下一篇:Python中数字值的陷阱,“有多深?”