Ada通用子实例化声称需要自身

时间:2019-05-08 16:55:30

标签: generics ada

我有一个带有以下签名的通用软件包

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 个答案:

答案 0 :(得分:4)

我可能会误解这个问题,但这在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;

答案 1 :(得分:4)

哦,发生的事情是依赖关系图不准确,原因是您需要使用层次结构中最深的泛型。 (例如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-完整的依赖路径,就无法找到 real 依赖;这是嵌套式和分层式打包组织之间的区别:您不需要(也不能)with嵌套单元,您必须使用最深层次的单元)。