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

Ada's private types visibility in implementation

私有类型在单元的实现中可见吗?例如,.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);

产生编译错误:"constraint no allowed when type has a constrained partial view"。

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

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

另一方面,由于 String_Block 的 public 声明指定类型受限,因此您当然必须指定默认值。也许你的意思是:

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

再次声明:据我们所知,您的代码是有效的,以上只是关于更好的内存使用的建议。