我创建了以下示例代码:
with Ada.Text_IO;
procedure Main is
type My_Type is
(A,
B,
C);
procedure Foo (The_Type : My_Type) is
begin
null;
end Foo;
procedure Bar (B : String) is
begin
-- Error
Foo (The_Type => B);
-- Ok
Foo (The_Type => My_Type'Succ (A));
-- Ok
Foo (The_Type => My_Type'Value ("B"));
end Bar;
begin
Bar ("Hello");
end Main;
在枚举类型B
中定义的文字My_Type
在过程Bar
中也用作参数名。不幸的是,编译器假定在过程调用Foo (The_Type => B);
中B
是参数的名称,而不是已定义的枚举类型中的文字B
。我发现了两个非最佳解决方案来解决该问题。如果我对重命名文字或参数名称不感兴趣,还有其他解决方案吗?
答案 0 :(得分:6)
您的问题是过程Bar中的参数B隐藏了过程Bar的封闭范围中声明的枚举标识符B。您只需使用参数命名作用域:
with Ada.Text_IO;
procedure Main is
type My_Type is
(A,
B,
C);
procedure Foo (The_Type : My_Type) is
begin
null;
end Foo;
procedure Bar (B : String) is
begin
Foo (The_Type => Main.B);
end Bar;
begin
Bar ("Hello");
end Main;