我有以下CORBA IDL 3.2,它试图声明一个相互递归的结构:
module SE
{
interface SE
{
typedef unsigned short MenuItemID; // a small integer representing a unique menu item
enum MenuSubaction { CollectCharacter, CollectStruct };
struct MenuItemAction; // forward declaration
union MenuSubactionParameter switch (MenuSubaction)
{ case CollectStruct: MenuItemAction sub_structure; // <<<<<<<<< use of forward
};
struct MenuItemAction { MenuSubaction menu_subaction;
MenuSubactionParameter menu_subaction_parameter;
};
}; // interface
}; // module
我在标有<lt<lt<
... SE.idl (line xx): Illegal reference to incomplete forward declaration of type MenuItemAction.
注意:这不是一个"正向接口"声明。
什么是"不完整远期申报"?(如果你成功地声明为正向声明,我不会认为正向声明是不完整的,只是还没有定义。也许这只是一个容易误解的短语)。
更重要的是,我如何定义我的递归结构?
我是CORBA的新手,所以我真的不知道自己在做什么。我不明白CORBA为什么不能定义这样的递归结构;传输一个不会递归的特定实例。特别是,这个树形成了一个树,CORBA应该很容易发送。
编辑:布赖恩的答案是对的。我需要取代直接提到的前向参考
MenuItemAction sub_structure
带有
sequence<MenuItemAction> sub_structure>
您可以转发声明structs,但有很多限制。
编辑:我不知道你使用的是什么版本的CORBA,但在2.6.1规范中,它在第3.10.2.3节(重点是我的)中说:
IDL语法允许生成递归结构和通过具有序列类型的成员的联合。
后来:
IDL支架通过结构和并集的前向声明的递归类型(以及值类型)。
后来:
不完整类型只能作为序列的元素类型出现释义具有不完全元素类型的序列称为不完全序列类型。
不完整序列类型只能作为另一序列的元素类型出现,或者作为结构或联合定义的成员类型。
示例:
struct Foo; // Forward declaration; Foo is incomplete
typedef sequence<Foo> FooSeq; // incomplete sequence type
struct Foo {
long value;
FooSeq chain; // incomplete seq. type used as struct member; OK
};
更多的信息可以在链接中找到,包括这个例子,它可能更接近你想要做的:
union Bar; // Forward declaration
typedef sequence<Bar> BarSeq;
union Bar switch(long) { // Define incomplete union
case 0:
long l_mem;
case 1:
struct Foo {
double d_mem;
BarSeq nested; // OK, recurse on enclosing
// incomplete type
} s_mem;
};
这似乎是一个已知的错误"4754974:idlj不支持结构和联合的前向声明":http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4754974
在上面的评论之后,我尝试了:
module SE
{
interface SE
{
typedef unsigned short MenuItemID; // a small integer representing a unique menu item
enum MenuSubaction { CollectCharacter, CollectStruct };
struct MenuItemAction; // forward declaration
union MenuSubactionParameter switch (MenuSubaction)
{
case CollectStruct: sequence<MenuItemAction> sub_structure; // <<<<<<<<< use of forward
};
struct MenuItemAction {
MenuSubaction menu_subaction;
MenuSubactionParameter menu_subaction_parameter;
};
}; // interface
这是有效的。你最终会得到一个序列而不是一条记录,但出于实践目的,这可能不是问题。