Generics 带有通用标签的包装

Generics 带有通用标签的包装,generics,ada,Generics,Ada,我想实现适用于我的工作的“Ada Decreated”(2005)中的队列管理器示例。最少需要的代码: 包装1.ads: 与Ada.Finalization; 使用Ada; 通用的 类型元素被标记为私有; 包裹清单是 使用Ada.Finalization; 类型项是具有私有属性的新元素; 类型Item_引用为accessall Item'Class; 类型Forward_List是由private控制的新列表; 函数Init return Forward_List; 函数为空(Self:Forw

我想实现适用于我的工作的“Ada Decreated”(2005)中的队列管理器示例。最少需要的代码:

包装1.ads:

与Ada.Finalization;
使用Ada;
通用的
类型元素被标记为私有;
包裹清单是
使用Ada.Finalization;
类型项是具有私有属性的新元素;
类型Item_引用为accessall Item'Class;
类型Forward_List是由private控制的新列表;
函数Init return Forward_List;
函数为空(Self:Forward\u List'Class)返回布尔值;
程序添加(Self:in-out-Forward_-List;I:in-Item'Class);
私有的
类型项为新元素,记录为空;
类型Forward\u列表是新的,由
记录
.........
结束记录;
类型Forward_List_Reference是访问所有Forward_List;
覆盖程序初始化(列表:输入输出前向列表);
覆盖程序最终确定(列表:输入输出转发列表);
结束名单;
包体:

包体列表是
函数Init return Forward_List为
FL\U new:转发列表\U引用:=新转发列表;
开始
返回FL_new.all;
end Init;
函数为空(Self:Forward\u List'Class)返回布尔值为
开始
返回Self.Count=0;
终点是空的;
程序添加(Self:in-out-Forward_-List;I:Item'Class)为
开始
无效的
结束添加;
程序完成(节点:输入输出转发\u列表\u节点)为
开始
无效的
最后定稿;
覆盖过程初始化(列表:in out Forward_列表)为
开始
无效的
结束初始化;
覆盖程序完成(列表:输入输出前向列表)为
开始
无效的
最后定稿;
结束名单;
Main.adb(使用此软件包):

与列表;
用蚊虫串;
与Ada一起完成;使用Ada.Finalization;
主要程序是
使用蚊虫串;
类型Temp是新控制的
记录
名称:整数;
结束记录;
包装临时清单为新清单(临时);
FL:Temp_List.Forward_List:=Temp_List.Init;
实例:Temp:=Temp'(使用
名称=>60);
开始
临时列表添加(自=>FL,
I=>实例);
端干管;
结果:

Builder结果
E:\ADA\test\u containers\20160303\main.adb
15:11需要一个访问类型,指定类型为列表中定义的“Item'class”。ads:10,实例在第9行
找到类型“Temp”
我整个星期都想解决这个问题,阅读有关这个问题的文献(包、带标签的记录、类范围的类型和泛型),但我无法理解这个问题

为了使此代码正常工作,我将包规范文件修改为(按元素替换了Item'Class): 包装2.ads:

与Ada.Finalization;
使用Ada;
通用的
类型元素是私有的;
包裹清单是
使用Ada.Finalization;
类型Forward_List是由private控制的新列表;
函数Init return Forward_List;
函数为空(Self:Forward\u List'Class)返回布尔值;
程序添加(Self:in-out-Forward\u列表;I:in-Element);
私有的
类型E_参考是访问所有元素;
类型Forward\u列表是新的,由
记录
.........
结束记录;
类型Forward_List_Reference是访问所有Forward_List;
覆盖程序初始化(列表:输入输出前向列表);
覆盖程序最终确定(列表:输入输出转发列表);
结束名单;
然后代码“main.adb”就开始了


这就是我的问题:我如何使用第一个规范(来自“Ada Decreated”(package1)的示例)?

Simon Wright在评论中给出了答案:

我把这个问题贴在comp.lang.ada上,一般认为这本书是错的


我将继续使用Element in方法(根据我问题中的package2)。

Simon Wright在评论中给出了答案:

我把这个问题贴在comp.lang.ada上,一般认为这本书是错的


我将继续使用方法中的元素(根据我问题中的package2)。

我认为我错了,但我不确定该示例是否实际可用。你不能直接使用Ada.Containers吗?(即使您在Ada2005上遇到了困难,也可以使用向量实现队列)。Simon,谢谢您的回答!我的任务之一是创建磁盘的文件夹树(带有ACL列表和其他特性),这就是为什么我决定为它创建自己的容器。所以我没有进行类型转换。我想知道这个示例(package1)是否可用。对我来说,很难相信书中的例子是不可用的。(对不起,我的英语不好)我把这个问题贴在了上,一般认为这本书是错的。@SimonWright非常感谢,你把这个问题从我脑海中删除了,我可以毫无疑问地完成我的工作。我想我是错的,但我不确定这个例子是否真的有用。你不能直接使用Ada.Containers吗?(即使您在Ada2005上遇到了困难,也可以使用向量实现队列)。Simon,谢谢您的回答!我的任务之一是创建磁盘的文件夹树(带有ACL列表和其他特性),这就是为什么我决定为它创建自己的容器。所以我没有进行类型转换。我想知道这个示例(package1)是否可用。对我来说,很难相信书中的例子是不可用的。(很抱歉我的英语不好)我把这个问题贴在了上,一般认为这本书是错的。@SimonWright非常感谢,你把这个问题从我的脑海中删除了,我可以毫无疑问地完成我的工作。