Вектор Ada перечислимого типа

Я пытаюсь создать вектор перечислимого типа в Ada, но компилятор, похоже, ожидает перегрузки функции равенства. Как мне сказать компилятору просто использовать функцию равенства по умолчанию. Вот что у меня есть:

package HoursWorkedVector is new Ada.Containers.Vectors(Natural,DAY_OF_WEEK);
--where Day of week is defined as an enumeration

Когда я пытаюсь скомпилировать, я получаю сообщение:

no visible subprogram matches the specification for "="

Нужно ли мне создавать функцию сравнения, чтобы иметь вектор перечислимого типа? Заранее спасибо.


person Victor    schedule 08.10.2015    source источник
comment
Определен ли DAY_OF_WEEK в том же пакете, что и HoursWorkedVector? Кроме того, является ли DAY_OF_WEEK объявлением переименования?   -  person ajb    schedule 08.10.2015
comment
Переименование декларации в моем предыдущем комментарии было ошибкой. Я должен был спросить, является ли DAY_OF_WEEK объявлением подтипа?   -  person ajb    schedule 08.10.2015
comment
Не могли бы вы опубликовать минимальный полный проверяемый пример, который вызывает ошибку? Сейчас я думаю, что нам не хватает информации.   -  person ajb    schedule 08.10.2015
comment
Похоже, что остальная часть кода вам не нужна, так как ваш первый вопрос привел меня прямо к решению. Фактически, DAY_OF_WEEK действительно определен в другом пакете. Я просто не включил здесь имя, потому что думал, что это будет неактуально, но когда я добавил предложение использования, файл скомпилировался без сучка и задоринки, поэтому, поскольку я ненавижу использование предложений использования, есть ли способ создать мой вектор type без предложения использования пакета?   -  person Victor    schedule 08.10.2015
comment
Превосходно! Это именно то, что я хотел. Спасибо, ajb, большое.   -  person Victor    schedule 08.10.2015


Ответы (2)


Определение Ada.Containers.Vectors начинается так :

generic
   type Index_Type is range <>;
   type Element_Type is private;
   with function "=" (Left, Right : Element_Type)
      return Boolean is <>;
package Ada.Containers.Vectors is

Значение <> в общей формальной функции определяется RM 12,6 (10):

Если универсальный модуль имеет subprogram_default, указанный в поле, и соответствующий фактический параметр опущен, то он эквивалентен явному фактическому параметру, который является именем использования, идентичным определяющему имени формального.

Итак, если, как вы сказали в комментариях, DAY_OF_WEEK определен в другом пакете, ваш экземпляр эквивалентен

package HoursWorkedVector is new Ada.Containers.Vectors(Natural, Other_Package.DAY_OF_WEEK, "=");

что не работает, потому что "=", который сравнивает значения DAY_OF_WEEK, не виден.

Вы можете включить Other_Package."=" в создание экземпляра, как предлагается в комментарии. Есть как минимум три способа сделать "=" видимым, чтобы ваш исходный экземпляр работал:

  1. use Other_Package; Это сделает "=" непосредственно видимым, но также сделает видимым все остальное, определенное в этом пакете. Возможно, это не то, что вам нужно.

  2. use type Other_Package.DAY_OF_WEEK; Это делает все операторы DAY_OF_WEEK непосредственно видимыми, включая "<", "<=" и т. Д., А также все литералы перечисления и любые другие примитивные подпрограммы DAY_OF_WEEK, которые вы могли объявить в Other_Package. Это, вероятно, излюбленное решение, если только по какой-либо причине не возникнет проблем с отображением литералов перечисления.

  3. Используйте объявление переименования, чтобы переопределить "=":

    function "=" (Left, Right : DAY_OF_WEEK) return Boolean renames Other_Package."=";

    Это делает "=" видимым.

person ajb    schedule 09.10.2015

Компилятор автоматически выбирает предопределенный оператор равенства:

with
  Ada.Containers.Vectors;

package Solution is
   type Day_Of_Week is (Work_Day, Holiday);

   package Hours_Worked_Vector is
     new Ada.Containers.Vectors (Index_Type   => Natural,
                                 Element_Type => Day_Of_Week);
end Solution;
person Jacob Sparre Andersen    schedule 08.10.2015