gpt4 book ai didi

types - Ada:子类型转换或调用“Base”

转载 作者:行者123 更新时间:2023-12-04 18:56:22 25 4
gpt4 key购买 nike

我有以下 - 简单 - 问题:用于表示度数的增量类型及其子类型,角度,我将范围限制为 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)) 也不起作用。

我是否错过了类型-子类型转换的概念(最有可能)并且有人有解决方案/解释吗?或者甚至更好的解决方案?

谢谢!

最佳答案

您的问题与类型转换无关,而是与理解类型和子类型之间的区别有关。

一个类型的所有子类型都具有完全相同的操作。类型的子类型(包括类型本身,从技术上讲是“类型的第一个子类型”)之间的差异只是允许值的集合。

这意味着您在 Degrees 之间的所有转换和 Limited_Degrees不要做太多,你的电话是Units.Base.Degrees."+" (Left, Right)实际上是一个递归调用。

我认为解决您的问题的方法是使 Limited_Degrees派生类型,而不是子类型。

关于types - Ada:子类型转换或调用“Base”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51885295/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com