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の特定のルールによるものです。2つのタグ付きタイプが(Bプライベートに)含まれ、Adaでは、サブプログラムはそのパラメーターの1つまたは関数の結果にディスパッチできます(実際には、すべてのパラメーターと結果が同じタグ付きタイプであれば問題ありません)。これは、Adaの単一継承設計の結果だと思います。

A実際にタグを付ける必要がありますか?(これは実際の問題コードの縮小版だと思います)。

との両方にタグを付ける必要がある場合ABの標準的な解決策function Some_Aは、そのパラメーター/結果の1つをクラス全体にすることです(クラス全体のパラメーターはディスパッチされません)。

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

また

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

アプリケーションの観点からどちらがより理にかなっているかに応じて; 2番目を推測すると、次のように言うことができます

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

ちなみに、読者にとってはより明確であり、あなたが言った場合、多くのカプセル化を失うことはありません

type B is tagged private;
于 2012-07-25T11:21:08.230 に答える