【问题标题】:Ada vector of enumerated type枚举类型的 Ada 向量
【发布时间】:2015-10-08 04:05:48
【问题描述】:

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

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 "="

我需要创建一个比较函数来获得一个枚举类型的向量吗?提前致谢。

【问题讨论】:

  • DAY_OF_WEEK 是否定义在与 HoursWorkedVector 相同的包中?另外,DAY_OF_WEEK 是重命名声明吗?
  • 我之前评论中的“重命名声明”是一个错误。我应该问,DAY_OF_WEEK 是子类型声明吗?
  • 能否请您发布导致错误的minimal complete verifiable example?现在,我认为我们遗漏了太多信息。
  • 看来您不需要其余的代码,因为您的第一个问题直接引导我找到解决方案。事实上,DAY_OF_WEEK 确实是在不同的包中定义的。我只是没有在这里包含名称,因为我认为它无关紧要,但是当我添加“use”子句时,文件编译顺利,所以,既然我讨厌使用“use”子句,有没有办法在没有“使用包”子句的情况下创建我的向量类型?
  • package HoursWorkedVector is new Ada.Containers.Vectors(Natural, My_Other_Package.DAY_OF_WEEK, My_Other_Package."=");

标签: comparison containers enumeration ada


【解决方案1】:

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

&lt;&gt;在泛型函数中的含义由RM 12.6(10)定义:

如果一个通用单元有一个由框指定的 subprogram_default,并且 省略对应的实参,则等价于 显式实参,其用法名称与 正式的定义名称。

因此,如您在 cmets 中所说,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 的所有运算符直接可见,包括"&lt;""&lt;=" 等,以及所有枚举字面量,以及DAY_OF_WEEK 的任何其他原始子程序您可能已在Other_Package 中声明。这可能是最喜欢的解决方案,除非出于某种原因使枚举文字可见会成为问题。

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

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

    这使得"=" 直接可见。

【讨论】:

    【解决方案2】:

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

    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;
    

    【讨论】:

      猜你喜欢
      • 2012-03-19
      • 1970-01-01
      • 2019-08-14
      • 2016-12-30
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      • 1970-01-01
      相关资源
      最近更新 更多