我有一个记录,并希望有一些访问函数。
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新手来说,这个错误有点神秘,我会理解我做错了什么,以及如何正确地做到这一点。
答案 0 :(得分:10)
这是因为ARM中的specific rule;涉及两种标记类型(B
私有),在Ada中,子程序可以dispatch对其中一个参数或函数结果(实际上,如果所有参数和结果都可以。是相同的标记类型)。我认为这是Ada单继承设计的结果。
您确实需要A
进行标记吗? (我希望这是实际问题代码的简化版本。)
如果需要标记A
和B
,function 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;