Ada 通用链表和通用包访问

问题描述 投票:0回答:1

操StackOverflow,操OpenAI。

nodes ada singly-linked-list
1个回答
6
投票

对于 Ada 中的通用包,您需要首先实例化它们。 GenericNode 不是一个包;它是包的配方,给定类型 item_type。这两个错误都表明了这个问题;编译器正确地指出不存在这样的包,也不存在这样的类型 NodePtr。 (“所选组件 GenericNode 中的前缀无效”只是意味着我不知道“GenericNode”是什么意思)

在 C++ 中,您可能确实希望在节点类型上参数化单链表,然后告诉编译器“只需获取此节点类型的 X 和 Y 成员,即使我没有告诉您该节点是什么”类型实际上is但是',Ada编译器拒绝这样做,因为它会导致容易出错的代码,您无法判断类型应该满足什么(C ++ 20中的契约旨在解决这个问题)。

Ada 不允许这样做;每个包在使用之前都必须实例化,以便知道每种类型的参数。不幸的是,这也意味着在 Ada 中不可能像在 C++ 中那样进行任意编译时计算。

如果您在 item_type 而不是 node_type 上参数化 GenericSLL,它可以使用该 item_type 实例化它需要的特定 GenericNode 包。只需要修改GenericSLL:

with GenericNode;

generic
   size : Positive;
   type item_type is private;
package GenericSLL is

   package LinkedList_Node is new GenericNode(item_type);
   use LinkedList_Node;

   type SLL is limited private;
   
   procedure Append(s : in out SLL; d : in item_type);
   
   procedure PrintTraversal(s : in SLL);
   
private
   type SLL is
      record
         head : NodePtr := null;
         length : Natural := 0; -- Positive starts at 1
      end record;

end GenericSLL;
© www.soinside.com 2019 - 2024. All rights reserved.