C ++函数重载类似的转换

时间:2009-12-23 05:23:17

标签: c++ ambiguity overloading

我收到一个错误,指出两个重载具有类似的转换。我尝试了太多东西,但没有人帮忙。

这是一段代码

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);

5 个答案:

答案 0 :(得分:4)

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

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

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

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);
}

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

答案 1 :(得分:2)

GetInput(13, FALSE, 30 * 10);

我猜是

FALSE ==> o ==> NULL is getting converted to std::string(NULL) 

因此,它无法确定实例化哪种方法。

T0证明了这一点:

GetInput(13, TRUE, 30 * 10); //有效吗

答案 2 :(得分:1)

您可能正在传递该函数的第二个参数既不是BOOL也不是string,而是一个可以隐式转换为其中的类型。

例如,

字符指针。

答案 3 :(得分:1)

要在调用函数时解决歧义,请将第二个参数强制转换为BOOL,或者如果确实是std :: string则使用string("whatever")

答案 4 :(得分:1)

考虑以下案例:

BOOL是int的typedef。

GetString(10,'a'); // compiler get confused in resolving the function

是否要将'a'转换为BOOL或字符串???

当你使用 static_cast 进行函数调用时,给出适当的参数来调用所需的函数。

char ch = 'a';
GetString(10,static_cast<BOOL>(ch)); // calls function with 2nd argument as BOOL

GetString(10,static_cast<string>(ch)); //calls function with 2nd argument as string