这真是一个烦人的问题。我有一个包含各种基本类型的记录类型,现在我需要它能够自己存储一个向量(来自 Ada.Containers.Vectors )!我想这是不可能的,但谁能给我关于如何以另一种方式解决这个问题的建议?为了让您更好地了解我在做什么,以下是不起作用的:
with Base_Types; use Base_Types;
with Ada.Strings.Wide_Unbounded; use Ada.Strings.Wide_Unbounded;
with Ada.Containers.Vectors;
with Green_Tasks; use Green_Tasks;
with Ada.Unchecked_Deallocation;
package Boxed_Types is
type String_Ptr is access Unbounded_Wide_String;
procedure Free_Unbounded_Wide_String is new Ada.Unchecked_Deallocation
(Object => Unbounded_Wide_String, Name => String_Ptr);
type Vector_Ptr; -- this won't work
type Type_T is (T_Null, T_UInt64, T_Text, T_Bool, T_GTask, T_Vector);
type Item (IType : Type_T := T_Null) is record
case IType is
when T_Null => null;
when T_UInt64 => UInt64 : UInteger_64;
when T_Text => String : String_Ptr;
when T_Bool => Bool : Boolean;
when T_GTask => Green_Task : Green_Task_Ptr;
when T_Vector => Item_Vector : Vector_Ptr; -- error here
end case;
end record;
package Item_Vectors is new Ada.Containers.Vectors
(Index_Type => Natural,
Element_Type => Item);
use Item_Vectors;
type Vector_Ptr is access Vector;
end Boxed_Types;
这给了我一个不那么意外的错误“在完全声明之前类型的无效使用”对于 Vector_Ptr。但是,我也不能在声明 Item 之前实例化向量包,我确实需要将向量和基本类型包装到一个记录类型中。(这是我在业余时间写的解释器;VM 必须在堆栈上存储各种不同的类型,存储在异构数组中,操作它们等等。)
我是否必须完全打破类型安全并弄乱地址才能访问转换,还是有更清洁的解决方案?