我想要一个扩展标记类型的容器。 防爆。 :
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类型的声明,它是依赖项中的类型。 如何在标记类型中嵌入容器?
答案 0 :(得分:0)
您有两种选择:
答案 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实现自己的队列。