3

相互再帰構造を宣言しようとする次の 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

<<<<< でマークされた行で、Sun JDK 1.7 idlj から苦情を受け取ります。

 ... SE.idl (line xx): Illegal reference to incomplete forward declaration of type MenuItemAction.

注: これは「転送インターフェイス」宣言ではありません。

「不完全な前方宣言」とは何ですか? (前方宣言として正常に宣言された場合、前方宣言が不完全であるとは思わず、まだ定義されていないだけです。おそらく、それは誤解しやすいフレーズです)。

さらに重要なことは、再帰構造を定義するにはどうすればよいでしょうか?

私は CORBA を初めて使用するので、自分が何をしているのかよくわかりません :-}。CORBA がそのような再帰構造を定義できない理由がわかりません。再帰的ではない特定のインスタンスを送信します。特に、これは CORBA が「簡単に」送信できるツリーを形成します。

編集:ブライアンは正しい答えを持っていました。前方参照の直接の言及を置き換える必要がありました。

         MenuItemAction sub_structure

         sequence<MenuItemAction> sub_structure>  
4

2 に答える 2

1

構造体を前方宣言できますが、多くの制限があります。

編集:使用している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;
};
于 2013-06-25T01:05:06.050 に答える
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

これは機能します。単一のレコードではなくシーケンスになりますが、実際には問題にならない可能性があります。

于 2013-06-23T13:45:47.410 に答える