2

swigを使用して、非常に多くのラップされたC++クラスを含むluaモジュールを作成しました。ラッパーは問題なく生成およびコンパイルされます(-Wallを使用)。しかし、私が見つけたいくつかの場所で、次の問題が発生しました。メンバーデータの基本的な割り当てが失敗します。

私が実行した場合:

Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
> require('myModule')
> a = myModule.ClassA()

次に、「a」にアタッチされたメタテーブルにすべてのメンバーデータが含まれていることを確認できます(この場合、クラスタイプClassBとClassCのフィールド「b」と「c」)。

私はさらに行うことができます:

> a.b = myModule.ClassB()

これにより、bがClassB()の新しいインスタンスに正常に再割り当てされます。しかし、私がやろうとすると:

> a.b.c = myModule.ClassC()

エラーメッセージが表示されます:

Error in ClassB_c_set (arg 2), expected 'ClassC *' got 'ClassB *'

'='の右側の式は、再割り当てされるデータフィールドを含む要素と同じタイプのオブジェクトであるかのように。何か簡単なものが欠けているに違いないと思いますが、壁に頭をぶつけて数時間も無駄になっています。

誰か考えがありますか?ありがとう!

4

2 に答える 2

3

これは SWIG のバグであることが判明しました。問題の原因を説明するバグ レポートを提出しました。

この問題は、ネストされた名前空間の問題と、SWIG がどのように機能するかについての誤解が組み合わさったことが原因でした。インターフェイス ファイルに %include を介して取り込んだ各項目は、gcc が #include を処理する方法で処理されると想定していました。ただし、SWIG ファイルでは、内容が参照される順序で %include する必要があります。

詳細については、リンクされたバグ レポートを参照してください。

于 2009-06-03T15:04:38.367 に答える