Ada 错误消息:对“…”的前缀调用中的对象&引用;必须使用别名

Ada 错误消息:对“…”的前缀调用中的对象&引用;必须使用别名,ada,Ada,我目前正在阅读此文档:。第8章(第33页)介绍了Ada中的面向对象编程。本章从以下示例开始: type T is tagged record V, W : Integer; end record; type T_Access is access all T; function F (V : T) return Integer; procedure P1 (V : access T); procedure P2 (V : T_Access); 下页介绍了如何调用子程序P1的示例:

我目前正在阅读此文档:。第8章(第33页)介绍了Ada中的面向对象编程。本章从以下示例开始:

type T is tagged record
   V, W : Integer;
end record;

type T_Access is access all T;

function F (V : T) return Integer;

procedure P1 (V : access T);

procedure P2 (V : T_Access);
下页介绍了如何调用子程序P1的示例:

declare
   V : T;
begin
   V.P1;
end;
这将导致以下错误:
对“P1”的前缀调用中的对象必须具有别名(RM 4.1.3(13 1/2))
。如果我更换程序P1(V:访问T)程序P1(V:输入输出T)示例已成功编译。这是文件中的一个打字错误吗?

是在2005年的修订版和中引入的(我得到的印象是,作为清理工作的一部分)

我得说文件是错的。也许这部分材料是在Ada 2005年之前开发的


的确,在某些情况下,标记的对象会自动别名:says

[…]标记类型的形式参数或泛型形式对象定义为别名

因此,这是合法的:

声明
程序过程(参数:输入输出T)为
开始
参数P1;
结束进程;
V:T;
开始
Proc(V);
结束;
在2005年的修订版和中引入(我得到的印象是,作为清理工作的一部分)

我得说文件是错的。也许这部分材料是在Ada 2005年之前开发的


的确,在某些情况下,标记的对象会自动别名:says

[…]标记类型的形式参数或泛型形式对象定义为别名

因此,这是合法的:

声明
程序过程(参数:输入输出T)为
开始
参数P1;
结束进程;
V:T;
开始
Proc(V);
结束;

我的印象是,标记的类型会自动添加别名。不是这样吗?@Jere,请看更新(我做了一个相当密集的手臂拖网来找到这个!)明白了,所以access变量的使用使它与众不同。奇怪的是,GNAT似乎并不完全支持标记类型的隐式别名。如果我想以“访问Param”为例,除非我将Proc的签名更改为使用Param:aliased in out t,甚至认为t被标记并用作正式的parameter@Jere,我认为它们保证通过引用传递。也许你的想法来自于此?@Álex事实上,我相信我看到过一位ARG成员在comp.lang.ada上发布的。Simon也为它找到了RM部分。我的印象是,标记的类型会自动地使用别名。不是这样吗?@Jere,请看更新(我做了一个相当密集的手臂拖网来找到这个!)明白了,所以access变量的使用使它与众不同。奇怪的是,GNAT似乎并不完全支持标记类型的隐式别名。如果我想以“访问Param”为例,除非我将Proc的签名更改为使用Param:aliased in out t,甚至认为t被标记并用作正式的parameter@Jere,我认为它们保证通过引用传递。也许你的想法来自于此?@Álex事实上,我相信我看到过一位ARG成员在comp.lang.ada上发布的。Simon也找到了它的RM部分;另一个解决方法是声明V:别名为T;