我有一个包,我将字符串转换为整数:
param: integer;
begin
param:= Integer'Value(param_string);
我的问题很简单,我想做同样的事情,但是使用通用软件包。泛型类型是TypeElement。但是我不能这样做:
param: TypeElement;
begin
param:= TypeElement'Value(param_string);
错误是'前缀',值“属性必须是标量类型”
有诀窍吗?
答案 0 :(得分:3)
您为TypeElement提供的通用形式类型必须表示标量类型。
如果你宣称它是私人的,例如:
generic
type TypeElement is private;
然后这不起作用,因为不能保证TypeElement将成为标量类型,正如您所发现的那样,需要使用'Value属性。您需要对离散类型使用一种通用形式类型表示,如Ada LRM 12.5.2中所列。
例如:
generic
type Type_Element_Discrete is (<>);
type Type_Element_Signed_Int is range <>;
type Type_Element_Mod is mod <>;
type Type_Element_Digits is digits <>;
type Type_Element_Delta is delta <>;
type Type_Element_Delta_Digits is delta <> digits <>;
package Gen_Convert is
function Gen_Convert (Param_String : String) return Type_Element_Discrete;
function Gen_Convert (Param_String : String) return Type_Element_Signed_Int;
function Gen_Convert (Param_String : String) return Type_Element_Mod;
function Gen_Convert (Param_String : String) return Type_Element_Digits;
function Gen_Convert (Param_String : String) return Type_Element_Delta;
function Gen_Convert (Param_String : String) return Type_Element_Delta_Digits;
end Gen_Convert;
指定适当的形式类型还可确保泛型的实例化器提供有效类型。这是相应的机构,展示了“价值转换:
”package body Gen_Convert is
function Gen_Convert (Param_String : String) return Type_Element_Discrete is
begin
return Type_Element_Discrete'Value(Param_String);
end Gen_Convert;
function Gen_Convert (Param_String : String) return Type_Element_Signed_Int is
begin
return Type_Element_Signed_Int'Value(Param_String);
end Gen_Convert;
function Gen_Convert (Param_String : String) return Type_Element_Mod is
begin
return Type_Element_Mod'Value(Param_String);
end Gen_Convert;
function Gen_Convert (Param_String : String) return Type_Element_Digits is
begin
return Type_Element_Digits'Value(Param_String);
end Gen_Convert;
function Gen_Convert (Param_String : String) return Type_Element_Delta is
begin
return Type_Element_Delta'Value(Param_String);
end Gen_Convert;
function Gen_Convert (Param_String : String) return Type_Element_Delta_Digits is
begin
return Type_Element_Delta_Digits'Value(Param_String);
end Gen_Convert;
end Gen_Convert;