在 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.5
是double
(参见floating point literal),而不是float
;和隐式转换为 int
或 float
被视为相同的排名。
如果您在这里假设 7.5
为 float
,您可以使用后缀 f
或 F
使其成为 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 文字类型的后缀列表:
- (无后缀)定义
double
f
F
定义 float
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
。
我尝试过对浮点数和整数使用重载。当我只使用整数时,代码运行良好,但是当我包含浮点数时,它给了我错误。代码如下:
#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.5
是double
(参见floating point literal),而不是float
;和隐式转换为 int
或 float
被视为相同的排名。
如果您在这里假设 7.5
为 float
,您可以使用后缀 f
或 F
使其成为 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 文字类型的后缀列表:
- (无后缀)定义
double
f
F
定义float
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
。