C++ c+中使用重载的模糊错误+;

C++ c+中使用重载的模糊错误+;,c++,overloading,overload-resolution,C++,Overloading,Overload Resolution,我曾尝试使用带浮点和整数的重载。当我只使用整数时,代码运行良好,但当我包含浮点值时,它会给我带来错误。代码如下: #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

我曾尝试使用带浮点和整数的重载。当我只使用整数时,代码运行良好,但当我包含浮点值时,它会给我带来错误。代码如下:

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

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

因为
7.5
是一个
双精度
(请参阅),而不是
浮点数
;隐式转换为
int
float
被认为是相同的排名

如果将
7.5
设为
float
,则可以使用后缀
f
f
将其设为
float
文字。e、 g

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));
float-fresult=计算(静态_-cast(7.5)、静态_-cast(7.5));

您应该已经发布了错误消息,该消息本身是不言自明的。错误消息提到了候选函数及其不完全兼容的原因:

默认情况下,浮点文本(
7.5
)的类型为double

以下是确定浮点文字类型的后缀列表:

  • (无后缀)定义
    double
  • f
    f
    定义
    float
  • l
    l
    定义
    长双精度

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

    就像整数的默认选择应该是
    int
    double
    应该是浮点数的默认选择一样
    float
    用于非常特殊的用例,这些用例都不可能适用于您的情况。请参阅软件工程堆栈交换

    作为遵循本指南的一个副作用,您在这里的特殊问题消失了:

    #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;
    }
    
    #包括
    使用名称空间std;
    int计算(int x,int y);
    双计算(双x,双y);
    常量int mainit=4;
    int main()
    {
    int结果=计算(5,5);
    double fresult=计算(7.5,7.5);
    
    错误消息应该有助于理解。您阅读了吗?当您遇到此类问题时,请发布准确的错误消息。不包括错误消息的向下投票。智能用户可能会搜索错误消息中的固定文本。如果没有错误,他们将找不到此问题和答案。太好了!现在代码与您一起工作t错误。谢谢!
    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);
    
    #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;
    }