为什么前缀呼叫对访问类型不起作用?

Tam*_*inn 2 ada

我的程序包中有一些方法可以对访问常量进行操作,以访问标记的记录。为了调用这些函数,我必须指定程序包名称。我宁愿只放置变量名[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)

fly*_*lyx 5

这是行不通的,因为按照您的定义,它foo不是标记类型的原始操作Color。前缀表示法只能用于标记类型的原始操作。

解决方案是进行类似以下foo的原始操作Color

procedure foo (C : access constant Color) is
begin
   null;
end foo;
Run Code Online (Sandbox Code Playgroud)

如果使用命名访问类型,foo则将是该类型的原始操作,并且由于该类型不是标记类型,因此前缀表示法不起作用。


Sim*_*ght 5

问题在于(在此复制器中)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的全类类型,或指定这些类型之一的访问参数。