在「盒裝類型」的實施方案(用於解釋器)我本來在子包載體中並用作System.Access_To_Address_Conversions從System.Address轉換爲Vector_Ptr如需要的,以便避免循環依賴看似不可逾越的問題。 (至少,每個人都沒有使用限制我的技巧。)它的工作,但似乎是一個討厭的黑客。所以我決定把容器類型放入Types.Boxed主包中。現在GNAT抱怨互相依賴類型聲明和Ada.Containers
有什麼辦法來解決這個問題「在第12行中定義的類型不完全‘矢量’可見部分沒有聲明」?或者我應該回到我討厭的黑客手中?
阿達2005中使用GNAT 4.6與標誌-gnat05
with Interfaces; use Interfaces;
with Ada.Strings.Wide_Unbounded; use Ada.Strings.Wide_Unbounded;
with Ada.Containers.Vectors;
with Green_Tasks; use Green_Tasks;
package Types.Boxed is
type Type_T is (T_Null, T_Unsigned_64, T_String, T_Boolean,
T_Green_Task, T_Vector);
type String_Ptr is access all Unbounded_Wide_String;
type Vector;
type Vector_Ptr is access all Vector;
type Item (IType : Type_T := T_Null) is record
case IType is
when T_Null => null;
when T_Unsigned_64 => Value_Unsigned_64 : Unsigned_64;
when T_String => Value_String : String_Ptr;
when T_Boolean => Value_Boolean : Boolean;
when T_Green_Task => Value_Green_Task : Green_Task_Ptr;
when T_Vector => Value_Vector : Vector_Ptr;
end case;
end record;
procedure Free (Datum : in out Item);
procedure Box (Datum : out Item; Value : in Unsigned_64);
function Unbox (Datum : Item) return Unsigned_64;
procedure Box (Datum : out Item; Value : String_Ptr);
function Unbox (Datum : Item) return String_Ptr;
procedure Box (Datum : out Item; Value : in Boolean);
function Unbox (Datum : Item) return Boolean;
procedure Box (Datum : out Item; Value : in Green_Task_Ptr);
function Unbox (Datum : Item) return Green_Task_Ptr;
function Get_Boxed_Type (Datum : Item) return Type_T;
-- vectors
package Item_Vectors is new Ada.Containers.Vectors
(Index_Type => Natural,
Element_Type => Item
);
use Item_Vectors;
function Vector_New (Size_Hint : Positive) return Item;
function Unbox (Datum : Item) return Vector_Ptr;
procedure Vector_Free (V : in out Vector_Ptr);
function Vector_Copy (V : Vector_Ptr) return Item;
pragma Inline (Box);
pragma Inline (Unbox);
pragma Pure_Function (Unbox);
pragma Pure_Function (Get_Boxed_Type);
end Types.Boxed;
擴展任何Container的問題是返回容器類型(Vector有7個值)並因此必須被覆蓋的函數的數量。 –
@SimonWright不,從Ada 2005開始,函數不必在類型擴展是_null擴展_時被覆蓋。 – ajb
O是的,我現在記得,* my *在這些行上的嘗試是爲了擴展有額外的內容。哎呀。 –