2010-06-19 73 views
4

SWIG不包裝派生類的繼承靜態函數。如何解決?SWIG支持繼承靜態成員函數

下面是該問題的一個簡單說明。

這是一個簡單的C++頭文件:

// file test.hpp 
#include <iostream> 

class B 
{ 
public: 
    static void stat() 
    { std::cerr << "=== calling static function B::stat" << std::endl; } 

    void nonstat() const 
    { std::cerr << "==== calling B::nonstat for some object of B" << std::endl; } 
}; 

class D : public B {}; 

的C++源文件只是包含頭文件:

// file test.cpp 
#include "test.hpp" 

的SWIG接口文件只是包含C++頭文件:

// file test.swig 
%module test 
%{ 
#include "test.hpp" 
%} 

%include "test.hpp" 

然後我通過這個生成swig包裝器代碼:

swig -c++ -tcl8 -namespace main.swig 

然後,我通過這個創建共享庫:

g++ -fpic -Wall -pedantic -fno-strict-aliasing \ 
       test.cpp test_wrap.cxx -o libtest.so 

所以在TCL解釋器libtest.so加載,並試圖用包裹界面的時候,它有以下行爲:

% load libtest.so test 
% test::B b 
% test::D d 
% b nonstat # works fine 
% d nonstat # works fine 
% test::B_stat # works fine 
% test::D_stat # DOESN'T WORK !! 

所以問題是我如何讓SWIG包裝D :: stat?

回答

1

該靜態函數僅在父項class B中定義正確?如:

D::stat(); 

不可調用是否正確?這就是爲什麼SWIG不包裝的功能...

至於如何訪問該功能,SWIG允許您添加/隱藏/包裝功能從任何你想要的類,所以這是可能的「修復」SWIG類別以訪問stat()

相信語法是這樣的:

%extend D { 
    ... 
} 

它已經有一段時間我感動痛飲,所以我可能記錯的東西。

+0

感謝您回覆Petriborg。 在C++ D :: stat()是可調用的,因爲有一個公共函數B :: stat()和D公開從B繼承。問題是SWIG不會包裝D :: stat()。 如果使用%extend,我必須重寫stat: %extend D {0} {0} {0}靜態void stat() {B :: stat(); } } 這解決了這個問題,(即我將能夠調用%test :: D_stat),但這是一個解決方法;我的意思是我正在寫代碼,我不應該; SWIG可以自動處理它;只有當我知道沒有更好的辦法時,我纔會這樣做。 SWIG專家,請建議其他方式(或者說沒有更好的辦法)! – Vahagn 2010-06-20 03:25:14

+0

我不知道在C++中,您可以通過這種方式調用子類的靜態方法,這很有趣。這可能是一個解決辦法,但我想我並不感到驚訝,發生這種情況。在Java中,您不會繼承靜態方法IIRC。 *聳肩*。 – Petriborg 2010-06-21 01:13:01