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

标签 types operator-overloading ada

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

相关文章:

c++ - 在 C++ 中重载 new、delete

operator-overloading - 如何定义 'AT-POS'方法?

vb.net - VB.NET 中重载 'And' 运算符的示例是什么?

ada - 使用访问类型在 protected 对象中调用过程时出现问题

xcode - Mac OS 上的 Ada 编译器 GNAT

ada - 是否可以声明 Range 类型的变量或常量?

c# - C# 中的显式对象数组类型转换?

haskell - 类定义中的管道是什么意思?

haskell - 类型构造函数可以与值构造函数相同吗?

c# - 如何从存储的运行时类型构建列表或数组类型以便进行比较?