Main_Pkg と Second_Pkg が十分に密接に関連しているため、これらのパッケージの 1 つが他のパッケージで定義されているものにアクセスする場合、それらを完全に別個の汎用パッケージにすることは、それらを整理する正しい方法ではありません。両方を他のパッケージの子にすることを検討してください。
あなたは次のようなものを持っているように聞こえます
generic
type T is private;
package Main_Pkg is ... end Main_Pkg;
generic
type T is private;
package Second_Pkg is ... end Second_Pkg;
これは、Main_Pkg と Second_Pkg を T の同じ型でインスタンス化する必要があるというルールを設定しないことに注意してください。プログラムが次のようなことを言う場合
package Main_Inst is new Main_Pkg (T => T1);
package Second_Inst is new Second_Pkg (T => T2); -- some different type
明らかに、Second_Inst と Main_Inst は (ジェネリック型 T を使用して) 互いに通信できませんでした。それらを同じ型でインスタンス化しても、以前は接続が存在しなかった 2 つのインスタンス化の間に魔法のように接続が発生することはありません。
したがって、2 つのジェネリックの間に何らかの関連性がなければなりません。一般的なフォーマル パッケージは、Simon が提示した 1 つの可能性です。もう 1 つの可能性は、Second_Pkg が Main_Pkg のインスタンスである一般的な正式なパッケージ パラメーターを持つことです。
generic
with package With_Main_Pkg is new Main_Pkg (<>);
package Second_Pkg is ...
Second_Pkg は With_Main_Pkg を参照できるようになりました ( With_Main_Pkg.T
Main_Pkg の正式な型を取得するために使用できます)。
ただし、Main_Pkg と Second_Pkg をより大きなパッケージに入れ、Main_Pkg と Second_Pkg の代わりに T をそのより大きなパッケージのパラメーターにするのが最も簡単かもしれません。
generic
type T is private;
package Larger_Pkg is
package Object_Inst is new Object_Pkg (T);
-- this might belong in Larger_Pkg's body, instead of the specification.
-- The bodies of Main_Pkg and Second_Pkg would both have it available.
package Main_Pkg is ...
package Second_Pkg is ...
end Larger_Pkg;
T 以外のジェネリック パラメータが必要な場合は、Main_Pkg と Second_Pkg もジェネリックにする必要があるかもしれません。知らない。このソリューションでは、Main_Pkg と Second_Pkg の仕様を別々の単位にすることはできません。それらを Larger_Pkg にネストする必要があります。ただし、個別のコンパイル ( ) を使用して本体を個別に作成することはできますpackage body Main_Pkg is separate;
。また、Main_Pkg と Second_Pkg をジェネリックにできる場合は、それらを子ユニットにすることができます。
generic
package Larger_Pkg.Main_Pkg is ...
end Larger_Pkg.Main_Pkg;
ただし、Object_Inst を Larger_Pkg の本体に含めることはできません。ただし、それは私的な部分にある可能性があります。
とにかく、最良の答えは、これらのパッケージが実際のプログラムでどのような概念を表すことになっているかによって部分的に異なります。