2017-01-06 13 views
0

私は現在、(「Ada.Text_IO.Put」)ジェネリック型を印刷しようとしていますが、これは常にそのようなエラーで失敗します。一般的なタイプの印刷方法

missing argument for parameter "Item" in call to "Put" declared at a-tiinio.ads:60, instance at a-inteio.ads:18 
expected type "Standard.Integer" 
found private type "My_Type" defined at testtype.ads:2 

は、これらのエラーは意味をなさないが、私は私の値を印刷する方法を知りません。 次の行は私のジェネリック型を示しています。

generic 
    type My_Type is private; 
    with function "+"(Left: My_Type; Right: My_Type) return My_Type; 

package TestType is 
    ... 
end TestType; 

ありがとうございました!

答えて

6

次のような他の一般的なパラメータを必要とすることができます

with function image(Item : in My_Type) return String; 

は、単に画像機能により、文字列の出力を印刷します。

実際のパラメータの例は次のようになります。

image => Integer'Image 
2

「それ」は、任意のタイプで動作し、Text_IOのそれはそのサブプログラムを呼び出すときに、それが知られているタイプで動作することをされていることを、一般的な存在のポイントつまり文字列であれば、何らかのタイプを印刷するために何か他のものが必要です。したがって、タイプからStringに変換する特殊関数を渡すか、Jim Rogersと答えてください。または、印刷のためにMy_Typeと共に汎用正式パッケージを渡します。例えば。

generic 
    type Any_Type is private; 
package Any_Type_IO is 
    procedure Put (Item : Any_Type); 
    procedure Get (Item : out Any_Type); 
end Any_Type_IO; 

with Any_Type_IO; 
generic 
    type My_Type is private; 
    with function "+"(Left: My_Type; Right: My_Type) return My_Type; 
    with package Printer is new Any_Type_Io (Any_Type => My_Type); 
package TestType is 
    procedure Run_Test; 
end TestType; 

だから、一緒にTestTypeの一般的な実際の型になるためのタイプと、TestTypeの一般的な実際のパッケージになるためのパッケージが存在します。彼らは一致します。 TestTypeのインスタンス内で、それらを一緒に使用できます。

type T is range 1 .. 10; 
package T_IO is new Any_Type_IO (T); 

package My_Test_Instance is new TestType 
    (My_Type => T, 
    "+"  => "+", 
    Printer => T_IO); 

あなたは、このようなAny_Type_IOなどの印刷パッケージを提供する場合は、印刷が両方の意味で、一般的な次のようになります。それは、一致する印刷パッケージの仕事であり、それはまた、エイダの意味での一般的な形式的なパッケージと一致する必要があります。

関連する問題