2017-02-11 84 views
1

我想要一個擴展標記類型的容器。例如, :擴展標記類型的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; 

當我嘗試編譯這段代碼,我有以下錯誤:「nonlimited類型的擴展名不能有限制組件」

我不能改變根類型的聲明這是一個類型依賴關係。 如何嵌入標籤類型的容器?

+0

如果你想在擴展類型中使用有限的組件(「限制」禁止分配),你必須使根類型受到限制,就像在'type Root是抽象標記的有限私有'中一樣。 –

回答

0

你有兩個選擇:

  1. 使用非受限容器類型。
  2. 使您的標記類型有限(正如Brian在評論中所建議的那樣)。
+0

'Bounded_Synchronized_Queues.Queue'是一種受保護的類型,即受限制。所有其他隊列類型也是如此。 –

+0

我讀到的問題是關於將容器放入記錄中。 –

+0

我的意思是'Ada.Containers.Bounded_Synchronized_Queues.Queue'是(a)在標準庫中,(b)是有限的,這與您的選項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派生的類型的方式是一個好主意。

0

您是否確實需要標準Ada.Containers.*.Queue?因爲它們被實現爲受保護的類型,它們是limited,並賦予任務安全性。如果沒有,你可以按照標準的Vector來實現你自己的Queue。