2017-11-29 9 views
0

フラットバッファスキーマでテーブルをforward_declareする方法を理解できません。flatbufferスキーマの循環依存関係を削除するために宣言テーブルを転送する方法はありますか?

include "c1.fbs" 
table C2 
{ 
    c1: C1; 
} 

問題c2.fbsでc1.fbsで

//

include "c2.fbs" 
table C1 
{ 
    c2 : C2; 
} 

//:

  1. スキーマの上には、flatc(1.8.0)で罰金コンパイル、生成されたcppヘッダーに循環依存を引き起こします! flatcも文句を言ってはいけませんか? PS「c2.fbs」

が含まれています:c1.fbsにC2を宣言転送、およびコールを削除する方法

  • 具体的 を、私はFBSスキーマで以下のクラス構造を模倣しようとしているこの問題をつまずきました。

    union Cs {C2, C3}; 
    class C1 
    { 
        Cs x; 
    } 
    
    class C2 : public C1 
    { 
        List <C1> y; 
    } 
    
    class C3 : public C1 
    { 
    } 
    

    助けてください。

  • +0

    「C2」、「C3」は列挙型の値とクラス名ですか? – Jarod42

    +0

    私は、C2クラスとC3クラスが宣言された組合Csを作りたがっていました。 質問からcppタグを削除させてください。私の疑いは、フラットバッファーの周りをもっと巡ります。 –

    答えて

    0

    FlatBuffersスキーマ言語には前方宣言文はなく、FlatBuffersは自動的にサイクルをサポートします。あなたが見ているのは、C++ジェネレータのバグでなければなりません。なぜなら、なぜすべてが事前宣言されているのか分かりませんから、FlatBuffers githubサイトで問題を提出してください。

    回避策として、今のところ1つのファイルに貼り付けることがあります。

    +0

    問題をgithubで追跡してください: https://github.com/google/flatbuffers/issues/4408 –

    +0

    ええ..生成されたヘッダーにインクルードがなく、すべてのクラスが前方宣言されているのでその中に。 –

    +0

    これにはどんな真の解決策がありますか? 1つのスキーマを作成する場合の回避策は、スキーマを膨大かつ維持しにくくすることです。 フォワード宣言に関しては、現在はファイル内の構造体だけが宣言されており、他のインクルードファイルの構造体は宣言されません。 私は一時的なものとして何を提案しますか?解決策は、ヘッダーのインポート制限の前に前方宣言を持つことです。したがって、サイクルの場合でもすべての前方宣言がファイル内にあります。 –

    関連する問題