Enum литерал также используется в качестве имени параметра - PullRequest
1 голос
/ 25 марта 2019

Я создал следующий пример кода:

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 в определенном типе перечисления.Я нашел два неоптимальных решения для решения проблемы.Есть ли другие решения, если меня не интересует переименование литерала или имени параметра?

1 Ответ

6 голосов
/ 25 марта 2019

Ваша проблема заключается в том, что параметр B в процедуре Bar скрывает идентификатор перечисления B, объявленный в прилагаемой области видимости для процедуры Bar.Вам нужно только назвать область с параметром:

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;
...