2012-03-18 111 views
3

考慮以下類聲明:包裝專業C++模板類痛飲

namespace X { 
template<class T> 
class Foo { 
public: 
    Foo(); 
    virtual ~Foo(); 

    T value() const; 
}; 

template<class T> 
class Foo<vector<T>> { 
public: 
    Foo(); 
    virtual ~Foo(); 

    T value(const int) const; 
}; 
} 

他們我已經在foo.i文件中的以下聲明

%include "stl.i" 
%include "std_string.i" 
%include "std_vector.i" 

namespace X { 
using namespace std; 

template<class T> 
class Foo { 
public: 
    Foo(); 
    virtual ~Foo(); 
    T value() const; 
}; 

template<class T> 
class Foo<vector<T> > { 
public: 
    Foo(); 
    virtual ~Foo(); 
    T value(const int) const; 
}; 

%template(FooInt) Foo<int>; 
%template(FooString) Foo<string>; 
%template(FooVectorInt) Foo<vector<int> >; 

} 

兩個階級之間的差異後者對向量容器的專門化 value()方法的不同簽名,其中第一個不帶任何參數,第二個帶有期望的整數。

包裝代碼由痛飲放在一起wrapps的%template(FooVectorInt)錯誤的,因爲它調用value()方法而不是專門的向量方法value(const int)的。給我下面的編譯錯誤消息:

foo_wrap.cxx: in function »int _wrap_FooVectorInt_value(lua_State*)«: 

/home/noobsaibot/foo/bindings/src/lua/foo_wrap.cxx:6706:81: error: no matching function to call »X::Foo<std::vector<int> >::value() const« 
/home/noobsaibot/foo/src/foo.h:78:5: note: candidate is: T X::Foo<std::vector<_RealType> >::value(int) const [with T = int, int = unsigned int] 

任何建議,以什麼我可能會丟失,使痛飲瞭解哪些功能是正確的?

歡呼

回答

2

您可以通過執行實現你想要的結果:

%include "stl.i" 
%include "std_string.i" 
%include "std_vector.i" 

namespace X { 
using namespace std; 

%rename(FooVectorInt) Foo<std::vector<int> >; 

class Foo<std::vector<int> > { 
public: 
    virtual ~Foo(); 
    int value(const int) const; 
}; 

template<class T> 
class Foo { 
public: 
    Foo(); 
    virtual ~Foo(); 
    T value() const; 
}; 

%template(FooInt) Foo<int>; 
%template(FooString) Foo<string>; 
} 

這工作,因爲你在接口文件中寫 C++和所有重要的是正確的代碼由SWIG生成。如果你想重複這些,你可以編寫宏(反正它接近%template)。

儘管如此,這不是一個非常乾淨的解決方案 - 我預計這將與專業化「一起工作」,並且我也看不到更簡單的解決方法。

+0

忘記我寫的,我沒有得到一個錯誤。現在開始檢查它是​​否做它應該做的事情:) ...迄今爲止感謝。 – noobsaibot 2012-03-19 20:41:47

+0

它編譯和我得到「正確的」對象Foo >,但是,類型不知道lua ...渲染對象在lua內不可用:/ ... – noobsaibot 2012-03-19 21:41:06

+0

@noobsaibot - 你是什麼意思「不知道去盧阿?「它看起來像是在我做的Python測試中正確註冊的。 (我從來沒有在我的生活中使用lua) – Flexo 2012-03-20 15:18:31