我有一个简单的问题:用delta类型表示度数,其中一个子类型是角度,我将其范围限制在0.0 .. <360.0之间。 现在,我想覆盖子类型的“+”运算符,以使用自己的模运算符:
package ...
type Degree is digits Degree_Digits;
end package
package ...
subtype Limited_Angle is Degree range Degree_Min .. Degree_Max;
function "+" (Left, Right : in Limited_Angle) return Limited_Angle;
end package
实现方法:
function "+" (Left, Right : in Limited_Angle) return Limited_Angle is
res : Degree;
begin
res := Units.Base.Degrees."+"(Left, Right);
...
return Limited_Angle(res);
end "+";
但我不喜欢这种方式,使用+-运算符进行调用。我的第一个想法是使用类似于 的方式:
res := Degree(Left) + Degree(Right);
但是这个方法不起作用。我的编译器警告有无限递归的问题。 即使更加严格:
res := (Degree(Left)) + (Degree(Right));
这是有关无限递归的警告。我不理解其原理。T(S)不应该将S转换为T吗?它不能是优化问题,因为(T(S))也不起作用。
我是否误解了类型-子类型转换的概念(很可能),有人有解决方案/解释吗?或者甚至有更好的解决方案?
谢谢!