Generics ';具有外部包的泛型正文中不允许访问属性

Generics ';具有外部包的泛型正文中不允许访问属性,generics,ada,Generics,Ada,我对Ada中的泛型有一些问题。给出以下示例,gnatmake的结果是: g_package.adb:13:33: 'Access attribute not allowed in generic body g_package.adb:13:33: because access type "t_callback_p" is declared outside generic unit (RM 3.10.2(32)) g_package.adb:13:33: move 'Access to priva

我对Ada中的泛型有一些问题。给出以下示例,gnatmake的结果是:

g_package.adb:13:33: 'Access attribute not allowed in generic body
g_package.adb:13:33: because access type "t_callback_p" is declared outside generic unit (RM 3.10.2(32))
g_package.adb:13:33: move 'Access to private part, or (Ada 2005) use anonymous access type instead of "t_callback_p"
gnatmake: "g_package.adb" compilation error
假设外部包无法更改,有没有办法解决这个问题?我首先得到了错误消息的原因(编译器不知道泛型包的正确类型,但是当所传递的函数没有触及泛型包的任何部分时,这有点令人讨厌。)

g_package.adb

with Ada.Text_IO; use Ada.Text_IO;
with external;

package body g_package is
   procedure quix (f : String) is
   begin
      Put_Line ("Does a thing");
   end quix;

   procedure foo (bar : String) is
   begin
      Put_Line ("baz" & bar & Boolean'Image(flag));
      external.procedure_f (quix'Access);
   end foo;
end g_package;
g_包装广告

generic
   flag : Boolean;
package g_package is
   procedure foo (bar : String);
end g_package;
外部广告

package external is
   type t_callback_p is access procedure (s : String);
   procedure procedure_f (proc : t_callback_p);
end external;

在Ada里没办法这么做。如果您希望不可移植并且正在使用(看起来)GNAT,您可以使用GNAT特定属性
“无限制访问”

在Ada中无法做到这一点。如果您希望不可移植并且正在使用(如图所示)GNAT,您可以使用GNAT特定属性
'Unrestricted\u Access

您可以(如错误消息中所述)移动“访问软件包规范的专用部分:

private with external;

generic
   flag : Boolean;
package g_package is
   procedure foo (bar : String);

private
   procedure quix (f : String);
   quix_access : constant external.t_callback_p := quix'Access;

end g_package;
使用体内的常数:

external.procedure_f (quix_access);
您可以(如错误消息中所述)将“访问包规范的私有部分:

private with external;

generic
   flag : Boolean;
package g_package is
   procedure foo (bar : String);

private
   procedure quix (f : String);
   quix_access : constant external.t_callback_p := quix'Access;

end g_package;
使用体内的常数:

external.procedure_f (quix_access);

太好了,非常感谢。我不太明白错误消息所说的是什么,所以感谢您过早地解释它的戳-
实例化。adb:4:01:g_包的实例化错误。ads:9
实例化。adb:4:01:子程序不能比访问类型更深有什么想法吗?您不能在主子程序中实例化泛型,它必须与访问类型处于同一级别,即在这种情况下的库级别非常完美,非常感谢。我不太明白错误消息所说的是什么,所以感谢您过早地解释它的戳-
实例化。adb:4:01:g_包的实例化错误。ads:9
实例化。adb:4:01:子程序不能比访问类型更深有什么想法吗?您不能在主子程序中实例化泛型,它必须与访问类型处于同一级别,即本例中的库级别