2011-10-05 101 views
2

我想用SWIG來包裝一個C++類來創建一個Java接口,但是當我在我的文件上運行SWIG時,它會生成空文件。SWIG問題,正在生成空文件

我下面的例子在這裏找到:http://www.opensource.apple.com/source/swig/swig-4/swig/Examples/java/class/index.html?txt

我有一個頭文件是這樣的:

#include <list> 
#include <set> 
#include <map> 
#include <Heap.h> 
#include "Controller.h" 
namespace Arbitrator 
{ 
    template <class _Tp,class _Val> 
    class Arbitrator 
    { 
    public: 
    Arbitrator(); 
    bool setBid(Controller<_Tp,_Val>* c, _Tp obj, _Val bid); 
    bool setBid(Controller<_Tp,_Val>* c, std::set<_Tp> objs, _Val bid); 
    bool removeBid(Controller<_Tp,_Val>* c, _Tp obj); 
    bool removeBid(Controller<_Tp,_Val>* c, std::set<_Tp> objs); 
    bool removeAllBids(Controller<_Tp,_Val>* c); 
    bool accept(Controller<_Tp,_Val>* c, _Tp obj, _Val bid); 
    bool accept(Controller<_Tp,_Val>* c, std::set<_Tp> objs, _Val bid); 
    bool accept(Controller<_Tp,_Val>* c, _Tp obj); 
    bool accept(Controller<_Tp,_Val>* c, std::set<_Tp> objs); 
    bool decline(Controller<_Tp,_Val>* c, _Tp obj, _Val bid); 
    bool decline(Controller<_Tp,_Val>* c, std::set<_Tp> objs, _Val bid); 
    bool hasBid(_Tp obj) const; 
    const std::pair<Controller<_Tp,_Val>*, _Val>& getHighestBidder(_Tp obj) const; 
    const std::list< std::pair<Controller<_Tp,_Val>*, _Val> > getAllBidders(_Tp obj) const; 
    const std::set<_Tp>& getObjects(Controller<_Tp,_Val>* c) const; 
    void onRemoveObject(_Tp obj); 
    _Val getBid(Controller<_Tp,_Val>* c, _Tp obj) const; 
    void update(); 
    private: 
    std::map<_Tp,Heap<Controller<_Tp,_Val>*, _Val> > bids; 
    std::map<_Tp,Controller<_Tp,_Val>* > owner; 
    std::map<Controller<_Tp,_Val>*, std::set<_Tp> > objects; 
    std::set<_Tp> updatedObjects; 
    std::set<_Tp> objectsCanIncreaseBid; 
    std::set<_Tp> unansweredObjected; 
    bool inUpdate; 
    bool inOnOffer; 
    bool inOnRevoke; 
    }; 

    template <class _Tp,class _Val> 
    Arbitrator<_Tp,_Val>::Arbitrator() 
    { 
    inUpdate=false; 
    inOnOffer=false; 
    inOnRevoke=false; 
    } 

    //other code removed to save space 

我創建了一個看起來像這樣的接口文件:

/* arb.i */ 
%module arb 
%{ 
#include "Arbitrator.h" 
%} 

/* grab header file */ 
%include "Arbitrator.h" 

但是當我運行SWIG時:

swig -c++ -java arb.i 

SWIG創建的Java文件是空的。

有沒有人有這個問題/知道如何解決這個問題?

感謝

回答

2

你必須明確地指示痛飲來生成模板代碼,用%模板指令。

SWIG 2.0 documentation on templates

痛飲提供了處理模板的支持,但默認情況下,它 不會產生任何成員變量或函數封裝器 模板類。爲了創建這些包裝,你需要明確告訴SWIG實例化它們。這是通過 %模板指令完成的。

SWIG 2.0 Templates chapter一些簡單的例子:

/* Instantiate a few different versions of the template */ 
%template(intList) List<int>; 
%template(doubleList) List<double>; 
+0

感謝,這是確切的問題。 –