gpt4 book ai didi

generics - 如何使用子包/通用包实例化中的类型

转载 作者:行者123 更新时间:2023-12-02 09:04:19 24 4
gpt4 key购买 nike

我可以使类型的原始子程序直接可见使用所有类型,如下所示:

package Type_Package is
type T is null record;
procedure Action(X: T) is null;
end Type_Package;

with Type_Package;
procedure Use_Type is
use all type Type_Package.T;
X: Type_Package.T;
begin
Action(X);
end Use_Type;

但是,当我将 Type_Package 移入其中时,它似乎不起作用Use_Type

procedure Use_Type is
package Type_Package is
type T is null record;
procedure Action(X: T) is null;
end Type_Package;
use all type Type_Package.T;
X: Type_Package.T;
begin
Action(X);
end Use_Type;

我明白了

gcc -c use_type.adb
use_type.adb:9:04: "Action" is not visible
use_type.adb:9:04: non-visible declaration at line 4
gnatmake: "use_type.adb" compilation error

当我实例化通用包时,也会发生同样的情况。为了例如,当我想使用 Ada.Containers 中的数据类型时。

package Element_Set is
new Ada.Containers.Hashed_Sets(Element_Type, Hash, "=");
use all type Element_Set.Set;

这里的use type子句似乎没有效果。

当类型在子包或子包中声明时如何使用该类型通用包的实例化?

最佳答案

您确实发现了编译器错误。

有一组测试( Ada Conformity Assessment Test Suite 、ACATS - 以及 here ),其中“B 系列”旨在检查编译器是否捕获错误。

其中一项测试,B840003 ,像你的问题一样开始:一个精简且稍作修改的版本的行为如下:

 1. procedure B840003 is
2. begin
3.
4. declare
5. package Pkg_1 is
6. type Enum is (Aaa, Bbb, Ccc);
7. procedure Prim_Proc (X : Enum := Aaa) is null;
8. function Prim_Func return Enum is (Bbb);
9.
10. package Nested is
11. procedure Nonprim_Proc (X : Enum := Bbb) is null;
12. function Nonprim_Func return Enum is (Ccc);
13. end Nested;
14.
15. end Pkg_1;
16.
17. begin
18. declare
19. use all type Pkg_1.Enum;
20. begin
21. if Prim_Func /= Bbb then -- OK.
22. null;
23. end if;
24. if Nonprim_Func (Ccc) /= Ccc then -- ERROR:
|
>>> "Nonprim_Func" is not visible
>>> non-visible declaration at line 12

25. null;
26. end if;
27. Prim_Proc; -- OK.
28. Nonprim_Proc (Aaa); -- ERROR:
|
>>> "Nonprim_Proc" is not visible
>>> non-visible declaration at line 11

29. end;
30. end;
31.
32. end B840003;

(参见第 27 行),而更接近您的示例(将包声明拉到子程序的声明区域)则执行以下操作:

 1. procedure B840003_Mod is
2. package Pkg_1 is
3. type Enum is (Aaa, Bbb, Ccc);
4. procedure Prim_Proc (X : Enum := Aaa) is null;
5. function Prim_Func return Enum is (Bbb);
6.
7. package Nested is
8. procedure Nonprim_Proc (X : Enum := Bbb) is null;
9. function Nonprim_Func return Enum is (Ccc);
10. end Nested;
11.
12. end Pkg_1;
13.
14. use all type Pkg_1.Enum;
15. begin
16. if Prim_Func /= Bbb then -- OK.
17. null;
18. end if;
19. if Nonprim_Func (Ccc) /= Ccc then -- ERROR:
|
>>> "Nonprim_Func" is not visible
>>> non-visible declaration at line 9

20. null;
21. end if;
22. Prim_Proc; -- OK.
|
>>> "Prim_Proc" is not visible
>>> non-visible declaration at line 4

23. Nonprim_Proc (Aaa); -- ERROR:
|
>>> "Nonprim_Proc" is not visible
>>> non-visible declaration at line 8

24.
25. end B840003_Mod;

参见第 22 行(过程调用;第 16 行的函数调用没问题!)。

这值得向 AdaCore 报告错误(尽管我不希望他们放弃所有内容并急于修复它)。


有趣的是,早期版本的编译器例如GNAT CE 2018) 找不到 BbbCcc 不可见。

关于generics - 如何使用子包/通用包实例化中的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60246613/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com