- privateコンストラクタだから生成できない
%templateでそのクラスのwrapperを作成している。(wrapper作るとinstantつくるので)
対策: wrapperを作らない。必要なら、コンストラクタをpublicに置いたclassをswig用interfaceファイル内で再定義。 - allocate がかぶる
wrapper作成対象クラスにallocate関数があると、swigが内部生成するallocate関数とかぶる模様。
対策: クラスのallocate関数を%rename。 - typedefで定義された別名クラス名でインスタンスは作れない
そもそも、その別名クラス名のwrapperが作成されない。(元の型と別名型の共通性はswig内で管理されている)
対策: 元の名前のクラスを使う。 - template内typedefを利用した何か
概ねswigでうまく扱えない。もしかしたらできるのかもしれないが、%templateの展開地獄と型不一致地獄に延々巻き込まれるので、精神衛生上swigのversion upを待った方が良い。(2.0.5でtypedef絡みのpatchがありそうなので)。
対策: そのクラスのwrappingを諦める。伝家の宝刀 %extendを使い、その諦めたクラスを使っているクラスに諦めたクラスに対する代替I/Fを追加する。 - 例1: map::mapped_typeを使ってごちゃごちゃするOgre::MapIterator
対策: Managerクラス内のデータ参照に使っているので、Managerクラスにeach_datatypeを作る。 - 例2: Ogre::vector::typeを使うStringVector
対策: StringVector自体は、RubyのArrayと等価。なので、StringVectorの代わりにArrayを受け取る/返す操作をするI/Fを追加する。もしくはArrayの代わりに別途StringVectorを内部で使用している新しいクラスを自作、それ向けのI/Fを同様に追加。 - Listener/Handler対策
C++側にListenerクラスを継承したRubyクラスを登録し、C++側からRuby側のクラスを呼び出すタイプの話。SwigのドキュメントのCross language polymorphismに対策が書いてある。
対策- トップの%moduleにdirectors="1"
%module(directors="1") "MyNameSpace" - Ruby側で継承するListenerクラスwrapperにdirector
%feature("director") Ogre::FrameListener;
- トップの%moduleにdirectors="1"
2012年3月4日日曜日
Swig対処メモ
Swig 2.0.4を対象としています。
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿