Ваш тестовый код на самом деле состоит из двух элементов библиотеки:
with Generic_Stack;
package Stack_Int_Type is new Generic_Stack( Item_Type => Integer, Size => 32 );
объявляет пакет библиотеки Stack_Int_Type
, а
procedure Generic_Stack_Test
is
stack : Stack_Int_Type;
begin
stack.push( 3 );
end Generic_Stack_Test;
объявляет библиотечную процедуру, которая в известном виде знает ничего о Stack_Int_Type
.
Мы можем это исправить, добавив необходимые with
, но (компилируя с -gnatl
)
1. with Stack_Int_Type;
2. procedure Generic_Stack_Test
3. is
4. stack : Stack_Int_Type;
|
>>> subtype mark required in this context
>>> found "Stack_Int_Type" declared at stack_int_type.ads:2
5. begin
6. stack.push( 3 );
1 2
>>> invalid prefix in selected component "stack"
>>> prefixed call is only allowed for objects of a tagged type
7. end Generic_Stack_Test;
Здесь происходит то, что Generic_Stack
не объявляет тип, поэтому вы не можете объявить его экземпляр в строке 4; это своего рода синглтон. (Среди прочего, это означает, что он озадаченно назван: я бы назвал его Integer_Stack
. Никогда не вызывайте пакет _Type
; _Types
, может быть.) Исправляя это,
with Generic_Stack;
package Integer_Stack is new Generic_Stack( Item_Type => Integer, Size => 32 );
и
with Integer_Stack;
procedure Generic_Stack_Test
is
begin
Integer_Stack.push( 3 );
end Generic_Stack_Test;
Вы могли бы сделать Integer_Stack
local:
with Generic_Stack;
procedure Generic_Stack_Test
is
package Integer_Stack
is new Generic_Stack( Item_Type => Integer, Size => 32 );
begin
Integer_Stack.push( 3 );
end Generic_Stack_Test;