我收到一个错误,指出两个重载具有类似的转换。我尝试了太多东西,但没有人帮忙。
这是一段代码
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);
答案 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