Как мне создать хешированную карту целых чисел с векторами? - PullRequest
0 голосов
/ 28 января 2019

Я изучаю Аду (пытаясь решить https://adventofcode.com/2018/ проблемы).

У меня есть вектор ActivityVector из ActivityRecord записей:

type ActivityRecord is 
record
   dt: Ada.Calendar.Time;
   str: UStr.Unbounded_String;
end record;

package ActivityVector is new Ada.Containers.Vectors
   (Element_Type => ActivityRecord,
   Index_Type => Natural);

И я хочупоместить их в карту, где ключи Integer с.У меня есть следующее:

function IntegerHash(i: Integer) return Ada.Containers.Hash_Type;

package ActivityMap is new Ada.Containers.Indefinite_Hashed_Maps(
   Key_Type => Integer,
   Element_Type => Activity.ActivityVector.Vector,
   Hash => IntegerHash,
   Equivalent_Keys => "="
);

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

act_map.ads:9:04: instantiation error at a-cihama.ads:46
act_map.ads:9:04: no visible subprogram matches the specification for "="
act_map.ads:9:04: instantiation error at a-cihama.ads:46
act_map.ads:9:04: default "=" on "Vector" is not directly visible

Похоже, он ожидает оператора равенства, определенного для вектора?Я мог бы определить один, но сначала я хотел бы проверить, что:

  • Я правильно думаю о том, что требуется
  • Если есть более простой способ реализовать это

1 Ответ

0 голосов
/ 28 января 2019

Похоже, что он ожидает оператора равенства, определенного для вектора

Да.

Я мог бы определить один

Не делайте этого, просто используйте существующую функцию, определенную в вашем экземпляре Ada.Containers.Vectors:

package ActivityMap is new Ada.Containers.Indefinite_Hashed_Maps(
   Key_Type => Integer,
   Element_Type => Activity.ActivityVector.Vector,
   Hash => IntegerHash,
   Equivalent_Keys => "=",
   "=" => Activity.ActivityVector."="
);

Или, сделайте функцию Activity.ActivityVector."=" непосредственно видимой, выполнив

use type Activity.ActivityVector.Vector;
...