Ada中用limited interface实现类实例化泛型包编译报错求助
问题分析与解决方法
核心问题
你的代码存在两处关键问题:
- 泛型包体中调用接口方法时参数类型不匹配,导致编译错误;
- 可能存在的编码/标点符号问题引发语法解析错误(
missing ";"提示)。
具体修正步骤
1. 修正泛型包体的方法调用
在My_Generic_Package.adb中,你直接将My_Generic_Class类型的变量传入接口方法,但接口方法需要的是My_Generic_Type类型的参数,必须访问My_Generic_Class的Element成员。修改后的包体代码如下:
with Ada.Text_IO; package body My_Generic_Package is procedure Calling_Procedure_1 (Some_Parameter : in out My_Generic_Class) is begin Ada.Text_IO.Put_Line("Calling Procedure_1."); Procedure_1(Some_Parameter.Element); -- 访问内部的My_Generic_Type成员 end; procedure Calling_Procedure_2 (Some_Parameter_1 : in out My_Generic_Class; Some_Parameter_2 : in String) is begin Ada.Text_IO.Put_Line("Calling Procedure_2."); Procedure_2(Some_Parameter_1.Element, Some_Parameter_2); -- 访问内部的My_Generic_Type成员 end; end My_Generic_Package;
2. 确保泛型参数声明的语法正确性
My_Generic_Package.ads中的泛型参数声明本身是正确的:
with My_Interface_Package; generic type My_Generic_Type is limited new My_Interface_Package.My_Interface with private; package My_Generic_Package is type My_Generic_Class is record Element : My_Generic_Type; end record; procedure Calling_Procedure_1 (Some_Parameter : in out My_Generic_Class); procedure Calling_Procedure_2 (Some_Parameter_1 : in out My_Generic_Class; Some_Parameter_2 : in String); end My_Generic_Package;
若仍出现missing ";"错误,检查以下两点:
- 确保代码中所有标点符号均为英文符号(尤其是分号
;); - 若存在中文注释,将文件编码改为UTF-8(GNAT对UTF-8支持更友好),或暂时移除中文注释尝试编译。
3. 修正主程序的转义字符
将main.adb中的HTML转义字符=>替换为Ada标准语法的=>:
with Ada.Text_IO; with My_Class_Package; with My_Generic_Package; procedure Main is package My_Instanciated_Package is new My_Generic_Package(My_Generic_Type => My_Class_Package.My_Class); My_Object : My_Instanciated_Package.My_Generic_Class; begin My_Instanciated_Package.Calling_Procedure_1(My_Object); My_Instanciated_Package.Calling_Procedure_2(My_Object, "some_string"); Ada.Text_IO.Put_Line("Program terminated."); end Main;
编译与运行
使用GNAT编译命令:
gnatmake main.adb
运行生成的可执行文件,输出结果应为:
Calling Procedure_1. Inside Procedure_1. Calling Procedure_2. Inside Procedure_2. Program terminated.
内容的提问来源于stack exchange,提问作者dalex78
相关产品推荐
相关产品推荐

