Ада универсальный дочерний экземпляр утверждает, что нуждается в себе - PullRequest
0 голосов
/ 08 мая 2019

У меня есть универсальный пакет со следующей подписью

generic
    type T is private;
    with function "="(Left : T; Right : T) return Boolean is <>;
    with function Wide_Wide_Image(Self : T) return Wide_Wide_String is <>;
package Generics.Testing.Assertions is

У него есть дочерний пакет со следующей подписью

generic
    with function "<"(Left : T; Right : T) return Boolean is <>;
    with function ">"(Left : T; Right : T) return Boolean is <>;
package Generics.Testing.Assertions.Comparisons is

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

Это прекрасно работает:

package Integer_Assertions is new Generics.Testing.Assertions(
    Integer,
    Wide_Wide_Image => Integer'Wide_Wide_Image);

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

package Integer_Comparisons is new Integer_Assertions.Comparisons;

GPS находитComparisons пакет в Integer_Assertions просто отлично, как и должно быть.Но компилятор имеет две следующие ошибки:

missing "with Integer_Assertions.Comparisons;"

и

"Comparisons" not declared in "Integer_Assertions"

Хорошо?Но IntelliSense нашел это нормально.Хотя я давно не занимался разработкой Ada, поэтому, возможно, я забыл, как создать экземпляр универсального потомка универсального.

Поэтому вместо этого я пытаюсь использовать полное имя неэкземпляра:

package Integer_Comparisons is new Generics.Testing.Assertions.Comparison;

Который потерпел неудачу с:

invalid prefix in selected component "Generics.Testing.Assertions"

Насколько я помню, это должно быть.

Как мне на самом деле создать экземпляр потомка внутри пакета?

Ответы [ 2 ]

4 голосов
/ 09 мая 2019

О, происходит то, что граф зависимостей не точен, и причина в том, что вам нужно с самым глубоким универсальным в иерархии.(например, with Generics.Testing.Assertions.Comparison;)

Затем вы делаете это:

package Integer_Assertions is new Generics.Testing.Assertions
  ( Integer, Wide_Wide_Image => Integer'Wide_Wide_Image );

package Integer_Comparisons is new Integer_Assertions.Comparisons;

Причина этого заключается в том, что без with -ing полного пути зависимости real зависимость не может быть найдена;В этом заключается разница между организацией вложенных и иерархических пакетов: вам не нужно (и нельзя) with вложенных единиц, вы должны с самыми глубокими иерархическими единицами, которые выиспользовать.

4 голосов
/ 08 мая 2019

Возможно, я неверно истолковал вопрос, но это прекрасно компилируется в GNAT CE 2018:

with Generics.Testing.Assertions;
with Generics.Testing.Assertions.Comparisons;

procedure Main is

   package Integer_Assertions is
     new Generics.Testing.Assertions
       (Integer, Wide_Wide_Image => Integer'Wide_Wide_Image);

   package Integer_Comparisons is
     new Integer_Assertions.Comparisons;

begin
   null;
end Main;
...