在 C++ 中使用重载的歧义错误

Ambiguity error using overload in c++

我尝试过对浮点数和整数使用重载。当我只使用整数时,代码运行良好,但是当我包含浮点数时,它给了我错误。代码如下:

#include <iostream>
using namespace std;

int calculate(int x,int y);
float calculate(float x,float y);
const int MAININT=4;

int main()
{
    int result=calculate(5,5);
    float fresult=calculate(7.5,7.5);                 LINE X
    cout << (result + MAININT + fresult);             LINE Y
    return 0;
}

int calculate(int x,int y)
{
    int result=x*y;
    return result;
}

float calculate(float x,float y)
{
    int result=x*y;
    return result;
}

通过从 LINE Y 中删除 LINE X 和 fresult,代码没有给我任何错误。所以我猜LINE X一定有问题,但我不明白为什么会报错。

我收到的错误信息是:

[Error] call of overloaded 'calculate(double, double)' is ambiguous
[Note] candidates are:
[Note] int calculate(int, int)
[Note] float calculate(float, float)

我不理解错误消息,所以没有包含它们。我从songyuanyao的回答中明白我做错了什么,但下次我会从一开始就在我的问题中包含错误信息,这样会更容易在代码中看到我做错了什么。

因为7.5double(参见floating point literal),而不是float;和隐式转换为 intfloat 被视为相同的排名。

如果您在这里假设 7.5float,您可以使用后缀 fF 使其成为 float 文字。例如

float fresult = calculate(7.5f, 7.5f); // 7.5f is a float literal; no ambiguity

或者使用显式转换:

float fresult = calculate(static_cast<float>(7.5), static_cast<float>(7.5));

您应该已经发布了错误消息,它本身就是 self-explanatory。错误消息提到了候选函数以及 它们如何不完全兼容:

error: call of overloaded 'calculate(double, double)' is ambiguous
     float fresult=calculate(7.5,7.5);                
                                    ^
note: candidate: int calculate(int, int)
 int calculate(int x,int y);
     ^
note: candidate: float calculate(float, float)
 float calculate(float x,float y);

默认情况下,floating-point 文字(在您的情况下为 7.5)的类型为 double

这是确定 floating-point 文字类型的后缀列表:

  1. (无后缀)定义double
  2. f F 定义 float
  3. l L 定义 long double

虽然其他人已经告诉您歧义错误的来源,但我很惊讶没有人提到最简单的问题解决方案:只需使用 double 而不是 float.

就像 int 应该是整数的默认选择一样,double 应该是 floating-point 数字的默认选择。 float 适用于非常特殊的用例,其中 none 可能适用于您的情况。请参阅 "When do you use float and when do you use double" Software Engineering Stack Exchange。

作为遵循此准则的副作用,您在这里的特定问题消失了:

#include <iostream>
using namespace std;

int calculate(int x,int y);
double calculate(double x, double y);
const int MAININT=4;

int main()
{
    int result=calculate(5,5);
    double fresult=calculate(7.5,7.5);
    cout << (result + MAININT + fresult);
    return 0;
}

int calculate(int x,int y)
{
    int result=x*y;
    return result;
}

double calculate(double x, double y)
{
    double result=x*y; // the `int` here was a mistake in your original code anyway
    return result;
}

一些进一步的建议:

  • 避免using namespace std;.
  • 为预处理器宏保留 ALL_CAPS