2017-02-11 5 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 типа не может иметь ограниченные компоненты»

Я не могу изменить объявление типа Root это тип в зависимость. Как вставить контейнер в тегированный тип?

+0

Если вы хотите, чтобы ограниченный компонент («ограниченный» запрещал назначение, для начала) в расширенном типе, вам также необходимо ограничить корневой тип, как в «тип Root - абстрактный тегированный ограниченный частный». –

ответ

0

У вас есть два варианта:

  1. использовать не ограниченный тип контейнера.
  2. Сделайте свой тегированный тип ограниченным (как предлагает Брайан в комментариях).
+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, и обеспечивают безопасность задач. Если нет, вы можете реализовать свою собственную очередь в терминах, скажем, стандартного вектора.

Смежные вопросы