操作只能在一种类型中进行调度

时间:2012-07-25 09:14:09

标签: ada accessor gnat

我有一个记录,并希望有一些访问函数。

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新手来说,这个错误有点神秘,我会理解我做错了什么,以及如何正确地做到这一点。

1 个答案:

答案 0 :(得分:10)

这是因为ARM中的specific rule;涉及两种标记类型(B私有),在Ada中,子程序可以dispatch对其中一个参数或函数结果(实际上,如果所有参数和结果都可以。是相同的标记类型)。我认为这是Ada单继承设计的结果。

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

如果需要标记ABfunction Some_A的规范解决方案是使其参数/结果之一 class-wide (不调度类范围的参数):

function Some_A (Some_B : B'Class) return A;

function Some_A (Some_B : B) return A'Class;

取决于从应用的角度来看哪个更有意义;猜猜第二个,你可以说

The_A : A’Class := Some_A (Some_B => The_B);

顺便说一下,读者会更清楚,如果你说的话,也不会失去很多封装。

type B is tagged private;