我有一个小包文件,我只想定义一对整数数组,但我想通过将类型设为私有来保护它。但是在编译和调试之后,我得到了一个无法解决的编译错误。
这是我的代码:
package Objet_Packing is
type Objet_Type is private;
subtype Objet is private; // This is line 9
type Tableau_Objet (<>) is private;
private // This is line 13
type Objet_Type is record
Largeur : Integer;
Hauteur : Integer;
end record;
subtype Objet is Objet_Type;
type Tableau_Objet is array ( Integer range <> ) of Objet;
end Objet_Packing;
这是我得到的错误:
gcc-4.6 -c test_objet_packing.adb
objet_packing.ads:9:20: subtype indication expected
objet_packing.ads:13:01: only one private part allowed per package
gnatmake: "test_objet_packing.adb" compilation error
所以我不理解这两条消息,一些帮助会很棒。
答案 0 :(得分:5)
您不能拥有私有子类型。
要将某些内容声明为子类型,您必须指定它是子类型的基本类型。在隐藏基类型时,你不能暴露它是一个子类型的事实。
将其明确声明为Objet_Type
的子类型:
subtype Objet is Objet_Type;
或将其声明为私人类型:
type Objet is private;
在后一种情况下,您可以将其定义为私有部分中的派生类型:
type Objet is new Objet_Type;
这意味着您可能需要在某些地方添加转化。或者您可以将派生类型声明放在可见部分中。
另一方面,为什么你需要两个名字(Objet_Type
和Objet
)并且基本上是同一类型,这一点并不清楚。你想要做出什么区别?或许更好的选择是完全删除Objet
的声明,直接使用Objet_Type
本身。 (或许Objet
可能比Objet_Type
更好,但这是一个风格问题。)
正如Brian Drummond的评论所说:
第二个错误只是解析器无法理解第一个错误的错误结果......看到“私有”一词两次
这是您的软件包规范的修改版本,它只声明了一个私有记录类型。它编译没有错误。
package Objet_Packing is
type Objet is private;
type Tableau_Objet (<>) is private;
private
type Objet is record
Largeur : Integer;
Hauteur : Integer;
end record;
type Tableau_Objet is array ( Integer range <> ) of Objet;
end Objet_Packing;
虽然名称Tableau_Objet
意味着它仍然是Objet
的数组,但我不确定你为什么隐藏在私人类型之后(坦白说,因为我已经足够长了)我真的使用了Ada,我不完全确定你如何使用Tableau_Objet
类型。更透明的选择:
package Objet_Packing is
type Objet is private;
type Tableau_Objet is array ( Integer range <> ) of Objet;
private
type Objet is record
Largeur : Integer;
Hauteur : Integer;
end record;
end Objet_Packing;