看看这段代码(例如):
#include <iostream>
void print(unsigned int value);
void print(float value);
int main() {
print('a');
print(0);
print(3.14159);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我收到下一个错误:
'print(char)' 不明确
这里真正的问题是什么?我知道不止一个函数适用于主函数(打印函数)的任何调用。但真正的规则是什么function overloading(我怎样才能知道什么适合什么,哪些类型之间存在强制转换等等)
我如何知道不止一个函数适合该调用?(更多示例:不明显如何理解这两个函数适合调用)
#include <iostream>
void print(unsigned int value);
void print(int value);
int main() {
print(2.5);
}
Run Code Online (Sandbox Code Playgroud)
当您处理函数重载时,编译器会在幕后执行大量工作来执行函数重载解析。此处列出的详细信息非常好,但是我可以提供一些可能有用的链接,并尝试描述一些更重要的部分。
有3种可能的结果:
- 找到匹配项。调用被解析为特定的重载
- 未找到匹配项。参数不能与任何重载匹配
- 发现不明确的匹配。参数匹配多个重载
编译器执行操作的基本顺序是:
- 根据参数列表查找精确匹配
- 尝试通过晋升寻找匹配对象
- 尝试通过标准转换找到匹配项
- 尝试通过用户定义的转换找到匹配项
那么如何判断调用是否有歧义呢?
由于每个重载都必须具有唯一的参数,并且由于所有标准转换和所有用户定义的转换都被认为是相同的;如果函数调用通过标准或用户定义的转换匹配多个有效的声明-定义候选,则结果将是不明确的。
从你的例子来看:
void print( unsigned int value );
void print( float value );
print( 'a' );
print( 0 );
print( 3.14159 );
Run Code Online (Sandbox Code Playgroud)
在C++的情况下print( 'a' );无法找到精确匹配。它将首先尝试提升'a'为 an int,但没有print(int)声明定义的函数。然后它将尝试使用标准转换,它可以转换'a'为 anunsigned int和 a floating pointvalue。由于所有标准转换都被认为是相等的,这会导致歧义。
要解决这种歧义,您可以简单地declare-define使用所需的版本print( type );,也可以将类型显式转换为提供的重载参数类型之一。