Gnat (ada 95) 使用我的包时被错误“...不可见”弄糊涂了

Gnat (ada95) comfused by error "... is not visible" using my package

使用 Gnat 7.4.0。

我是 Ada 菜鸟,对错误消息感到困惑:

$ gnat make list_test.adb
x86_64-linux-gnu-gcc-7 -c list_test.adb
list_test.adb:9:18: "List" is not visible (more references follow)
list_test.adb:9:18: non-visible declaration at linked_list.ads:19
x86_64-linux-gnu-gnatmake-7: "list_test.adb" compilation error

我不明白为什么我的 List 不可见。

我正在尝试编写一个带有通用负载的链表来自学 Ada。我写了一个具有类似布局(通用除外)的二叉树,但没有出现此错误。

.ads:

with Ada.Unchecked_Deallocation;

generic
    type Payload_Type is private;

package Linked_List is

    type List_Node;
    type List_Node_Pointer is access all List_Node;

    type List_Node is
    record
        payload : Payload_Type;
        next    : List_Node_Pointer := null;
        prev    : List_Node_Pointer := null;
    end record;

    type List is
    record
        head  : List_Node_Pointer := null;
        tail  : List_Node_Pointer := null;
        count : Natural           := 0;
    end record;

    type List_Pointer is access all List;


    procedure pushTail( base    : in List;
                        payload : in Payload_Type );

    procedure pushHead( base    : in List;
                        payload : in Payload_Type );

    function popTail( base : List ) return Payload_Type;

    function contains( base    : List;
                       payload : Payload_Type ) return Boolean;


private

    procedure free is new Ada.Unchecked_Deallocation( List_Node, List_Node_Pointer );

end Linked_List;

还有.adb:(为了完整起见)

with Ada.Assertions;

package body Linked_List is

    procedure pushTail( base    : in out List;
                        payload : in Payload_Type ) is
    begin
        if ( base.head = null ) then
            -- list is empy
            base.head  := new List_Node;
            base.tail  := base.head;
            base.head.payload := payload;
        else
            -- list is not empty, add to the tail
            base.tail.next := new List_Node;
            base.tail.next.prev := base.tail;
            base.tail := base.tail.next;
            base.tail.payload := payload;
        end if;
        base.count := base.count + 1;
    end push;


    ...  -- More definitions for pushHead(), popTail(), contains()

private

end Linked_List;

list_test.adb 类似于:

with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
with Linked_List;

procedure List_Test is
    my_list    : List;
    found      : Boolean;
begin
    List.pushTail( my_list, Ada.Strings.Unbounded.To_Unbounded_String( "First" ) );
    List.pushTail( my_list, Ada.Strings.Unbounded.To_Unbounded_String( "2nd" ) );

    ... etc.

最初我的语法是:

my_list : Linked_List.List;

但是 Gnat 不喜欢它 - 我也不明白为什么它也没有被接受。

编辑:我也试过

procedure List_Test is
    package List_String is new List( Ada.Strings.Unbounded.Unbounded_String );

    my_list    : List_String;

但我得到了同样的 "List" is not visible 错误。

编辑 2:

with Linked_List;

procedure List_Test is
    package String_List is new List( Ada.Strings.Unbounded.Unbounded_String ); use String_List;

    my_list    : String_List;

仍然产生错误:

list_test.adb:10:32: "List" is not visible
list_test.adb:10:32: non-visible declaration at linked_list.ads:10
list_test.adb:10:89: "String_List" is undefined (more references follow)

由于 Linked_List 包是通用的,您不能直接引用类型 Linked_List.List。您只能在实例化包中引用 List 类型。因此,尝试在通用包 Linked_List 实例化之后直接插入 use List_String;,或者使用 List_String.List 引用 List_String 包中的 List 类型:

procedure List_Test is

   package List_String is 
      new Linked_List (Ada.Strings.Unbounded.Unbounded_String);
   use List_String;

   my_list : List

procedure List_Test is

   package List_String is 
      new Linked_List (Ada.Strings.Unbounded.Unbounded_String);

   my_list : List_String.List