5

我有一个记录,想要一些访问器功能。

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 新手来说有点神秘,我希望能得到一些解释我做错了什么以及如何正确地做。

4

1 回答 1

12

这是因为 ARM 中的特定规则;涉及到两种标记类型(B私下),在 Ada 中,子程序可以在其参数之一或函数结果上分派(实际上,如果所有参数和结果都是相同的标记类型就可以了)。我认为这是 Ada 单继承设计的结果。

你真的需要A被标记吗?(我希望这是实际问题代码的精简版)。

如果两者都A需要B标记,则规范的解决方案function Some_A是将其参数/结果之一设为类范围(类范围的参数不调度):

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;
于 2012-07-25T11:21:08.230 回答