2017-02-11 1 views
1

Ich möchte einen Container in einem erweiterten getaggten Typ haben. Bsp. :Ada Container in einem Extended getaggt Typ

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; 

Wenn ich versuche, diesen Code ich folgende Fehlermeldung haben zu kompilieren: eine Art zum Thema „Erweiterung der nonlimited Art haben, können nicht begrenzt Komponenten“

ich nicht auf die Angabe des Starttyp verändern kann eine Abhängigkeit. Wie kann ich einen Container in einen markierten Typ einbetten?

+0

Wenn Sie eine limitierte Komponente ("limited" verbietet die Zuweisung, für einen Start) in einem erweiterten Typ, müssen Sie auch den Stammtyp begrenzt, wie in 'type Root ist abstrakt markiert begrenzt private;'. –

Antwort

0

Sie haben zwei Möglichkeiten:

  1. Verwenden Sie einen nicht-begrenzten Containertyp.
  2. Machen Sie Ihren Tag-Typ eingeschränkt (wie Brian in den Kommentaren vorschlägt).
+0

"Bounded_Synchronized_Queues.Queue" ist ein geschützter Typ, d. H. Begrenzt. Das Gleiche gilt für alle anderen Warteschlangentypen. –

+0

Ich habe die Frage gelesen, dass es darum geht, einen Container in Aufzeichnungen zu setzen. –

+0

Ich meinte, dass "Ada.Containers.Bounded_Synchronized_Queues.Queue" ist (a) in der Standard-Bibliothek, (b) begrenzt, was Ihrer Option 1 widerspricht. –

0

Indirection kann ein Ausgangspunkt sein. Verwenden Sie einen Zeiger auf den eingeschränkten Typ. Wenn er als eine Aufzeichnungskomponente verwendet wird und nicht selbst begrenzt ist, erzwingt ein Zeiger keine Beschränkung des Aufzeichnungstyps.

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; 

Es könnte eine gute Idee sein, Wege der Verwendung einer Art von Ada.Finalization.Controlled abgeleitet zu prüfen, ob die Speicherverwaltung ein Problem.

0

Benötigen Sie eigentlich einen Standard Ada.Containers.*.Queue? weil sie als geschützte Typen implementiert sind, die limited sind, und Tasksicherheit geben. Wenn nicht, könnten Sie Ihre eigene Warteschlange in Form eines Standardvektors implementieren.