我正在为学校做Ada任务 . 我的老师为我提供了以下代码 . 这是一个通用树 .
generic
type Item_Type is private;
with procedure put(i : Item_Type);
我在我的测试文件中创建了一个新的通用树,就像这样 .
package FrequencyTree is new Tree_Pkg (FrequencyRecord);
use FrequencyTree;
现在我收到以下错误 .
treetest.adb:12:01: missing actual "put"
treetest.adb:12:01: in instantiation of "Tree_Pkg" declared at tree_pkg.ads:4
treetest.adb:12:01: instantiation abandoned
我知道我应该在某个地方以某种方式实现这个程序 put
,但在哪里以及如何?
2 回答
提供的通用单元声明formal type和formal subprogram,因此其通用instantiation需要实际类型和实际子程序 . 您的实际类型是
FrequencyRecord
;您的实际子程序应该是一个接受实际类型参数的过程FrequencyRecord
. 然后你可以用所需的实际参数instantiateTree_Pkg
.附录:如上所述here和here,实际子程序的概况必须符合正式子程序的概况,但名称可能不同 .
至于在研究trashgod's answer之后的地点和方式,请考虑以下方法:
在你进行这个实例化之前,必须确实存在:这里的Ada编译器从头到尾读取你的Ada文本,所以当它看到实例化时,它必须先看到它们 .
此要求意味着您要在实例化
Tree_Pkg
之前在文本行上定义YourOwnPut
,以使实例化行之前存在类型FrequencyRecord
和过程YourOwnPut
. 或者,可能选择了一些替代安排:例如,如果FrequencyRecord
和YourOwnPut
可以放在一个单独的包中,那么你就可以在任何编译单元的上下文子句中包装你的实例化行 . (根据错误消息判断,它可能被称为Treetest
. )说,因此,当您执行此实例化时,编译器已经看到并编译了包
Frequency_Stuff
. IOW,如果Item_Type
的实际参数Frequency_Stuff.FrequencyRecord
和Put
的实际参数Frequency_Stuff.YourOwnPut
,那么这些实际参数已经存在 .