Ada矢量的枚举类型

时间:2015-10-08 04:05:48

标签: comparison containers enumeration ada

我试图在Ada中创建一个枚举类型的向量,但编译器似乎期望一个相等的函数重载。如何将编译器设置为仅使用默认的相等函数。这就是我所拥有的:

package HoursWorkedVector is new Ada.Containers.Vectors(Natural,DAY_OF_WEEK);
--where Day of week is defined as an enumeration

当我尝试编译时,我收到消息:

no visible subprogram matches the specification for "="

我是否需要创建比较函数以获得枚举类型的向量?提前谢谢。

2 个答案:

答案 0 :(得分:3)

Ada.Containers.Vectors的定义如下:

generic
   type Index_Type is range <>;
   type Element_Type is private;
   with function "=" (Left, Right : Element_Type)
      return Boolean is <>;
package Ada.Containers.Vectors is

通用形式函数中<>的含义由RM 12.6(10)定义:

  

如果通用单元具有由框指定的subprogram_default,则   相应的实际参数被省略,那么它相当于一个   显式实际参数,它是一个与之相同的用法名   定义正式的名称。

因此,正如您在评论中所说,DAY_OF_WEEK在另一个包中定义,您的实例化等同于

package HoursWorkedVector is new Ada.Containers.Vectors(Natural, Other_Package.DAY_OF_WEEK, "=");

这不起作用,因为比较"="值的DAY_OF_WEEK不可见。

您可以在实例化中包含Other_Package."=",如评论中所示。至少有三种方法可以使"="可见,这样您的原始实例化就可以了:

  1. use Other_Package;这会使"="直接可见,但它也会使该包中定义的所有内容直接可见。这可能不是你想要的。

  2. use type Other_Package.DAY_OF_WEEK;这会使DAY_OF_WEEK的所有运算符直接可见,包括"<""<="等,以及所有枚举文字,以及您可能在DAY_OF_WEEK中声明的Other_Package的任何其他原始子程序。这可能是最受欢迎的解决方案,除非由于某种原因使枚举文字可见是一个问题。

  3. 使用重命名声明重新定义"="

    function "=" (Left, Right : DAY_OF_WEEK) return Boolean renames Other_Package."=";

    这使"="直接可见。

答案 1 :(得分:0)

编译器自动选择预定义的相等运算符:

with
  Ada.Containers.Vectors;

package Solution is
   type Day_Of_Week is (Work_Day, Holiday);

   package Hours_Worked_Vector is
     new Ada.Containers.Vectors (Index_Type   => Natural,
                                 Element_Type => Day_Of_Week);
end Solution;