Ada的私有类型在实施中的可见性

时间:2016-03-08 17:16:27

标签: types visibility private ada gnat

在单位的实施中是否可以看到私人类型?例如,.ads:

package Unlimited_Strings is
   type String_Block is private;
(...)
private
   Max_Block_Size : constant Integer := 10;
   subtype String_Size_Subtype is Integer range 0..Max_Block_Size;
   type String_Block(Size : String_Size_Subtype := Max_Block_Size) is record
      Next : Unlimited_String := null;        
      Str : String(1..Size) := (others => ' ');
   end record;

和.adb:

Aux_Ptr := new String_Block(Max_Block_Size);

产生编译错误:"当类型具有受约束的部分视图时,不允许约束"。

1 个答案:

答案 0 :(得分:3)

正如西蒙所说,我们需要一个复制器。我怀疑“.adb”文件并不是与你正在显示的.ads相对应的文件。

请注意,由于您使用的是判别式的默认值,因此实际上不会创建不受约束的类型。这意味着编译器将始终为String_Block(对应于Max_Block_Size)分配最大大小,即使您为Size指定了更小的值也是如此。这可能不是你想要的(这是一个棘手的领域)。

另一方面,由于String_Block的公开声明指定了类型受约束,因此您必须指定默认值。也许你的意思是:

   type String_Block (<>) is private;
private
   type String_Block (Size : String_Size_Subtype) is record ...

再说一遍:就我们所知,你的代码是有效的,上面只是对可能更好的内存使用情况的建议。