ジェネリックパラメーターの宣言は、型の関係(サブタイプ)を与えるのに十分なほど網羅的ではなく、この情報は単に失われます...例:
-- generic_p.ads
generic
type Index_Range_Type is range <>;
type Count_Range_Type is range <>;
procedure Generic_P (I : Index_Range_Type, C : Count_Range_Type);
-- generic_p.adb
procedure Generic_P (I : Index_Range_Type, C : Count_Range_Type) is
begin
if I = C then -- oops : cannot compare different types...
-- ...
end if;
end Generic_P;
-- main.adb
procedure Main is
type Index_Range_Type is 0 .. 512;
subtype Count_Range_Type is Index_Range_Type range 1 .. Index_Range_Type'Last;
procedure P is new Generic_P (Index_Range_Type, Count_Range_Type);
I : Index_Range_Type := 33;
C : Count_Range_Type := 42;
begin
if I = C then -- Ok : Count_Range is a subset of Index_Range, they can be compared
-- ...
end if;
P (I, C);
end Main;
これにより、generic_p.adbでの比較に対して次のエラーが発生します:invalid operand types [...] left operand has type "Index_Range_Type" [...] right operand has "type Count_Range_Type"
。サブタイピングは、一般的な手順では表示されません。
ジェネリックパラメーター間の関係を指定する方法はありますか?
詳細情報
Count_Range_Type
プロシージャのパラメータとして、を必要とする別のパラメータを追加できるようにする必要がありますCount_Range_Type
。
-- generic_p.ads
generic
type Index_Range_Type is range <>;
type Count_Range_Type is range <>;
with procedure F (C : Count_Range_Type);
procedure Generic_P (I : Index_Range_Type, C : Count_Range_Type);
タイプを直接使用することはできません。Pは完全に汎用的で独立している必要があります。