无法理解泛型如何工作

Pla*_*rth 1 ada gnat

我有一个名为Linked_List(.ads)的包,下面是代码:

Generic
   type T is private;
package Linked_List is
   type List is tagged record
       Data : T;
   end record;
end Linked_List;
Run Code Online (Sandbox Code Playgroud)

这里是包中包含main函数(main.adb)的代码

with Ada.Text_IO; use Ada.Text_IO;
with Linked_List;
procedure Main is
  type ListOfIntegers is new Linked_List(T => Integer);
begin
   null;
end Main;
Run Code Online (Sandbox Code Playgroud)

我收到这个错误:

4:30 subtype mark required in this context 
found "Linked_List" declared at linked_list.ads:3
found "Linked_List" declared at linked_list.ads:3
4:41 incorrect constrain for this kind of type
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏.

Sim*_*ght 5

new Linked_List(T => Integer)定义一个新,而不是一个新类型.您获得的错误消息是因为编译器认为您正在声明类型,因此在第30列看到包的名称会使其混淆; 它想看到(子)类型的名称.

第4行应该阅读

package ListOfIntegers is new Linked_List(T => Integer);
Run Code Online (Sandbox Code Playgroud)

之后有一个类型ListOfIntegers.List,所以你可以写

My_List : ListOfIntegers.List;
Run Code Online (Sandbox Code Playgroud)

你可能会发现不得不一直说ListOfIntegers.烦人; 你可以说

use ListOfIntegers;
Run Code Online (Sandbox Code Playgroud)

之后你就可以写了

My_List : List;
Run Code Online (Sandbox Code Playgroud)

但通常认为最好不要过度使用(如果你有几十个"软件"包,"使用"它们都会让你很难知道你指的是哪一个).

顺便说一句,正常的Ada用法是使用下划线来分隔标识符中的单词:List_Of_Names.