我的程序包中有一些方法可以对访问常量进行操作,以访问标记的记录。为了调用这些函数,我必须指定程序包名称。我宁愿只放置变量名[dot]函数名,但这会产生错误:no selector "foo" for type "Color"。这是为什么?
这是最小的复制器:
procedure Main is
type Color is tagged
record
Hue : Integer;
Saturation : Integer;
Value : Integer;
end record;
type AccessColor is access constant Color;
procedure foo (C : in AccessColor) is
begin
null;
end foo;
AccessS : AccessColor;
begin
foo (AccessS);
--AccessS.foo; -- does not work. Why?
end Main;
Run Code Online (Sandbox Code Playgroud)
请注意,在我的实际代码中,完全指定函数是不方便的,因为与上面的示例不同,foo是在单独的程序包中的某个位置定义的:
Some.Package.Name.Depp.foo(AccessS);
Run Code Online (Sandbox Code Playgroud)
即使AccessS已经指定在哪里可以找到函数,所以我应该能够做到:
AccessS.foo;
Run Code Online (Sandbox Code Playgroud)
这是行不通的,因为按照您的定义,它foo不是标记类型的原始操作Color。前缀表示法只能用于标记类型的原始操作。
解决方案是进行类似以下foo的原始操作Color:
procedure foo (C : access constant Color) is
begin
null;
end foo;
Run Code Online (Sandbox Code Playgroud)
如果使用命名访问类型,foo则将是该类型的原始操作,并且由于该类型不是标记类型,因此前缀表示法不起作用。
问题在于(在此复制器中)foo实际上不是原始操作Color。
ARM 3.3.2(6)表示,特定类型的原始子程序是
对于在package_specification中立即声明的特定类型,在同一package_specification中立即显式声明并在该类型上运行的任何子程序(除了枚举常量)
这样(为重新格式化,调整大小写而道歉)可以很好地编译。
procedure Main is
package Pak is
type Color is tagged
record
Hue : Integer;
Saturation : Integer;
Value : Integer;
end record;
procedure Foo (C : in Color) is null;
type AccessColor is access constant Color;
end Pak;
Col : aliased Pak.Color;
AccessS : Pak.AccessColor := Col'Access;
begin
AccessS.Foo;
end Main;
Run Code Online (Sandbox Code Playgroud)
我宣布Foo服用in Color; 您同样可以声明access constant Color是否需要这样做,因为(ARM 4.1.3(9.2))
子程序的第一个形式参数应为T类型,或覆盖T的全类类型,或指定这些类型之一的访问参数。
| 归档时间: |
|
| 查看次数: |
84 次 |
| 最近记录: |