Общий формальный тип, который вы предоставляете для TypeElement, должен представлять скалярный тип.
Если вы объявляете это как частное, например ::100100
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;