我目前正在尝试打印(“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;
感谢您的帮助!
答案 0 :(得分:6)
您可以要求使用其他通用参数,例如:
with function image(Item : in My_Type) return String;
然后只需打印Image功能输出的字符串。
实际参数的示例可能是:
image => Integer'Image
答案 1 :(得分: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,那么打印在两种意义上都会变得通用:它是任何匹配打印包的作用,并且它还必须与Ada意义上的通用正式包匹配。