我有一个记录,并希望它的一些访问器功能.
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;
Run Code Online (Sandbox Code Playgroud)
这就是GNAT给我的东西:
some_package.ads:10:13: operation can be dispatching in only one type
Run Code Online (Sandbox Code Playgroud)
对于Ada新手来说,这个错误有点神秘,我会理解我做错了什么,以及如何正确地做到这一点.
Sim*_*ght 10
这是因为ARM 中的特定规则 ; 有两种标记类型(B
私有),在Ada中,子程序可以调度其中一个参数或函数结果(实际上,如果所有参数和结果都是相同的标记类型就可以).我认为这是Ada单继承设计的结果.
你真的需要A
被标记吗?(我希望这是实际问题代码的简化版本).
如果同时A
并B
需要被标记,对于典型的解决方案function Some_A
是使它的参数/结果中的一个类宽(一个类宽参数没有调度):
function Some_A (Some_B : B'Class) return A;
Run Code Online (Sandbox Code Playgroud)
要么
function Some_A (Some_B : B) return A'Class;
Run Code Online (Sandbox Code Playgroud)
从应用的角度来看,取决于哪个更有意义; 猜猜第二,你可以说
The_A : A’Class := Some_A (Some_B => The_B);
Run Code Online (Sandbox Code Playgroud)
顺便说一句,读者会更清楚,如果你说的话,也不会失去太多的封装
type B is tagged private;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
674 次 |
最近记录: |