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