扩展标记类型的Ada容器

时间:2017-02-11 22:10:04

标签: oop generics ada

我想要一个扩展标记类型的容器。 防爆。 :

type Root is abstract tagged private;

package Queue_Interface
is new Ada.Containers.Synchronized_Queue_Interfaces
  (Element_Type => Ada.Strings.Unbounded.Unbounded_String);

package Queue_Factory
is new Ada.Containers.Bounded_Synchronized_Queues
  (Queue_Interfaces => Queue_Interface,
   Default_Capacity => 50);

type Child is new Root with record
      Trace_Queue : Queue_Factory.Implementation.List_Type(50);
end record;

当我尝试编译此代码时,我有以下错误:"无限制类型的扩展不能包含有限的组件"

我无法更改Root类型的声明,它是依赖项中的类型。 如何在标记类型中嵌入容器?

3 个答案:

答案 0 :(得分:0)

您有两种选择:

  1. 使用非限制容器类型。
  2. 限制您的标记类型(正如Brian在评论中所建议的那样)。

答案 1 :(得分:0)

间接可能是一个起点。使用指向限制类型的指针。如果用作记录组件而不受其自身限制,则指针不会强制限制记录类型。

 package Queue_Interface
 is new Ada.Containers.Synchronized_Queue_Interfaces
    (Element_Type => Ada.Strings.Unbounded.Unbounded_String);

 package Queue_Factory
 is new Ada.Containers.Bounded_Synchronized_Queues
    (Queue_Interfaces => Queue_Interface,
     Default_Capacity => 50);

 type List_Pointer is
     access Queue_Factory.Implementation.List_Type;

 type Child is new Cannot_Change.Root with record
      Trace_Queue : List_Pointer (50);
 end record;

如果内存管理存在问题,考虑使用从Ada.Finalization.Controlled派生的类型的方法可能是个好主意。

答案 2 :(得分:0)

你真的需要一个标准的Ada.Containers.*.Queue吗?因为它们是作为limited的受保护类型实现的,并且可以确保任务安全。如果没有,您可以根据标准Vector实现自己的队列。