我试图在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 "="
我是否需要创建比较函数以获得枚举类型的向量?提前谢谢。
答案 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."="
,如评论中所示。至少有三种方法可以使"="
可见,这样您的原始实例化就可以了:
use Other_Package;
这会使"="
直接可见,但它也会使该包中定义的所有内容直接可见。这可能不是你想要的。
use type Other_Package.DAY_OF_WEEK;
这会使DAY_OF_WEEK
的所有运算符直接可见,包括"<"
,"<="
等,以及所有枚举文字,以及您可能在DAY_OF_WEEK
中声明的Other_Package
的任何其他原始子程序。这可能是最受欢迎的解决方案,除非由于某种原因使枚举文字可见是一个问题。
使用重命名声明重新定义"="
:
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;