Ada 只能以一种类型分派操作

Ada 只能以一种类型分派操作,ada,accessor,gnat,Ada,Accessor,Gnat,我有一个记录,并希望一些存取功能 package Some_Package is type A is tagged record First_Field : Integer;

我有一个记录,并希望一些存取功能

package Some_Package is                                                             

   type A is tagged record                                                          
      First_Field  : Integer;                                                       
      Second_Field : Character;                                                     
   end record;                                                                      

   type B is private;                                                               

   function Some_A (Some_B : B) return A;                                           

private                                                                             

   type B is tagged record                                                          
      Some_A : A;                                                                   
   end record;                                                                      

end Some_Package;
这是GNAT给我的:

some_package.ads:10:13: operation can be dispatching in only one type
对于Ada新手来说,这个错误有点神秘,我希望能解释一下我做错了什么,以及如何正确地做;涉及到两种标记类型(
B
),在Ada中,子程序可以根据其一个参数或函数结果(实际上,如果所有参数和结果都是相同的标记类型,则可以)。我认为这是Ada单一继承设计的结果

您是否确实需要标记
A
?(我希望这是实际问题代码的简化版本)

如果
A
B
都需要标记,则
函数Some_A
的标准解决方案是生成其一个参数/结果(类范围内的参数不是:

从应用的角度来看,这取决于哪个更合理;猜猜第二个,你可以说

The_A : A’Class := Some_A (Some_B => The_B);
顺便说一句,如果你说,它对读者来说会更清晰,也不会失去太多的封装性

type B is tagged private;

回答得很好。我只想澄清一件事——在这种情况下,“发送”到底意味着什么?我尝试了一些谷歌搜索,但在Ada上下文中,它在不同的事情上使用的方式不同。@Mikolaj:特别是查看Ada Wikibook中关于的章节。@MarcC,我将你的链接复制到了答案中。谢谢。另请参阅有关派送表的信息。我认为(欢迎更正!)您的some_包代码需要两个表(而不是一个-单一继承),因此代码无法动态确定要在哪个表上分派。
The_A : A’Class := Some_A (Some_B => The_B);
type B is tagged private;