函数重载中的规则

时间:2018-03-12 21:33:23

标签: c++ overloading

查看此代码(例如):

#include <iostream>
void print(unsigned int value);
void print(float value);

int main() {
    print('a');
    print(0);
    print(3.14159);
    return 0;
}

我收到了下一个错误:

  

'print(char)'含糊不清

这里真正的问题是什么?我知道不止一个函数适用于来自main(打印函数)的任何调用。但是function overloading中的规则究竟是什么(我怎么知道什么适合什么,存在哪些类型存在等等)

我如何知道多个功能适合呼叫? (更多例子:不明显如何理解这两个函数适合于调用)

#include <iostream>

void print(unsigned int value);
void print(int value);

int main() {
    print(2.5);
}

2 个答案:

答案 0 :(得分:3)

当您处理函数重载时,编译器会在后台执行大量工作来执行函数重载解析。这里有详细介绍,但我可以提供一些可能有用的链接,并试着描述一些更重要的部分。

  

有3种可能的结果:

     
      
  • 找到匹配项。该呼叫已解决为特定过载
  •   
  • 找不到匹配项。参数不能与任何重载匹配
  •   
  • 找到了一个模糊的匹配。参数匹配多个重载
  •   
  

编译器的基本顺序是:

     
      
  • 根据参数列表
  • 查找完全匹配   
  • 尝试通过促销找到匹配
  •   
  • 尝试通过标准转换找到匹配项
  •   
  • 尝试通过用户定义的转化找到匹配
  •   
  

那么如何判断呼叫是否含糊不清?

由于每个重载都必须具有唯一的参数,并且所有标准转换和所有用户定义的转换都被认为是相同的;如果函数调用通过标准或用户定义的转换匹配多个有效的声明定义候选,那么结果将是不明确的。

来自您的示例:

void print( unsigned int value );
void print( float value );

print( 'a' );
print( 0 );
print( 3.14159 ); 

print( 'a' );的情况下,C ++无法找到完全匹配。它会首先尝试将'a'提升为int,但没有声明定义的print(int)函数。然后,它会尝试使用标准转换,它可以将'a'转换为unsigned intfloating point值。由于所有标准转换都被认为是相同的,因此会产生歧义。

要解决这种歧义,您可以简单地declare-define print( type );所需的版本,也可以将类型明确地转换为提供的重载参数类型之一。

答案 1 :(得分:1)

由于缺少print的版本而导致的错误:

print('a'); // calling print(int)
print(0);   // calling print(int) 
print(3.14159); // calling print(double) not float

正如您所看到的那样print(int)print(double)丢失,print(char)缺失,您会收到这些错误。例如,如果未提供print(char),则编译器会搜索print(int),因此会将传入的值转换为整数。

要解决此问题,您可以添加重载版本print,也可以显式转换传入的值:

1-重载打印:

void print(int value){ cout << "int: " <<  value << endl;}
void print(unsigned int value){ cout << "ui: " <<  value << endl;}
void print(float value){cout << "float: " << value << endl;}
void print(char c){ cout << "Char: " << c << endl;}
void print(double value){cout << "double: " << value << endl;}

2-施法:

print((unsigned int)'a'); // or (float)
print((unsigned int)0);  // or (float)
print(3.14159f); // or (float)3.14159 or (unsigned int)3.14159
  • 请注意,print(3.14159);是对print(double);的调用,而不是float为浮动执行此操作:print(3.14159f);