在单位的实施中是否可以看到私人类型?例如,.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);
产生编译错误:"当类型具有受约束的部分视图时,不允许约束"。
答案 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 ...
再说一遍:就我们所知,你的代码是有效的,上面只是对可能更好的内存使用情况的建议。