【发布时间】:2012-04-17 08:55:44
【问题描述】:
让源代码自己说话:
MLine::MLine(int x1, int y1, int x2, int y2)
{
}
MLine::MLine(double x1, double y1, double x2, double y2)
{
}
void __fastcall TVctDiag2::PrepareArrowTail(int x, int y)
{
double length_x1;
double length_y1;
MLine *line = new MLine(x, y, x - length_x1, y - length_y1);
}
编译器产生以下错误:
E2015 'MLine::MLine(int,int,int,int) at shapes.h:100' 和 'MLine::MLine(double,double,double,double) at shapes.h:110' 之间的歧义
我可以通过以下显式转换来解决这个问题:
MLine *line = new MLine((double)x, (double)y, x - length_x1, y - length_y1);
部分转换是不够的:
MLine *line = new MLine((double)x, y, x - length_x1, y - length_y1);
我对表达式中隐式转换的规则感到很困惑。有人可以解释这种行为吗?表达式'x - length_x1'和'y - length_y1'的数据类型是什么?
【问题讨论】:
-
x - length_x1 和 y - length_y1 的类型是 double,x,y 的类型是 int。所以编译器不知道使用哪个函数。它试图在 MLine(int, int, int, int) 和 MLine(double, double, double, double) 之间比较 MLine(int, int, double, double)。 MLine(double, int, double, double) 也有同样的问题。
-
我认为由于二元减号运算符的关联性是从左到右的,所以在减法之前将length_x1转换为int。
-
表达式产生的类型几乎从不依赖于元素的顺序。 int 与 double 混合总是产生一个 double。
-
@truthseeker:在这里查看promotion rules
-
在编写绘图框架时,通常整数或浮点数都有意义,但不能同时使用。我会删除其中一个重载,一切都会好起来的。
标签: c++ implicit-conversion c++builder-xe ambiguous-call