我有以下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;&lt;&lt;&lt;&lt;&lt;
的行上收到Sun JDK 1.7 idlj的投诉 ... SE.idl (line xx): Illegal reference to incomplete forward declaration of type MenuItemAction.
注意:这不是“前向接口”声明。
什么是“不完整的前瞻性声明”? (如果你成功地宣布为前向声明,我不认为前向声明是不完整的,只是尚未定义。也许这只是一个容易被误解的短语)。
更重要的是,我如何设法定义递归结构?
我是CORBA的新手,所以我不是真的: - }知道我在做什么。我不明白为什么CORBA不能定义这样的递归结构;一个传输不会递归的特定实例。特别是,这个树形成了一个树,CORBA可以“轻松”发送。
编辑:Brian有正确的答案。我需要替换直接提及前向参考, MenuItemAction sub_structure
与
sequence<MenuItemAction> sub_structure>
答案 0 :(得分:1)
它似乎是一个已知的错误“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
哪个有效。你最终会得到一个序列而不是单个记录,但出于实际目的,这可能不是问题。
答案 1 :(得分:1)
你可以转发声明结构,但有很多限制。
编辑:我不知道您使用的是哪个版本的CORBA,但是在2.6.1 specification中它在3.10.2.3节中强调(强调我的):
IDL语法允许生成递归结构和 通过具有序列类型的成员的工会。
后来:
IDL支持 通过结构和联合的前向声明递归类型 (以及有价值的类型)。
后来:
不完整类型只能作为序列的元素类型出现 定义。具有不完整元素类型的序列称为a 不完整的序列类型。
不完整的序列类型只能作为另一个序列的元素类型出现, 或者作为结构或联合定义的成员类型。
示例:
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;
};