2010-06-19 3 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 -c++ -tcl8 -namespace main.swig 

А затем создать общую библиотеку этим:

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

Так при загрузке libtest.so в TCL интерпретатора и пытается использовать обернутый интерфейс, он имеет следующее поведение:

% 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 { 
    ... 
} 

Свое время, так как я прикоснулся SWIG, так что я мог бы быть misremembering что-то.

+0

Спасибо за ответ Петриборг. В C++ D :: stat() является вызываемым, так как существует общедоступная функция B :: stat() и D наследует от B. Обычно проблема заключается в том, что SWIG не переносит D :: stat(). При использовании% продлить, мне нужно переписать stat: % extend D { Статический void stat() {B :: stat(); } } Это устраняет проблему (т. Е. Я могу вызвать% test :: D_stat), но это обходное решение; Я имею в виду, что я пишу код, который не должен; SWIG может обрабатывать его автоматически; Я пойду так, только если узнаю, что нет лучшего способа. Специалисты SWIG, пожалуйста, предложите другие способы (или скажите, что нет лучшего способа)! – Vahagn

+0

Я не знал, что в C++ вы могли бы вызвать статические методы дочернего класса таким образом, интересно. Это может быть работа вокруг, но я думаю, я не удивлен, что это происходит. В Java вы не наследуете статические методы IIRC. * Пожала плечами *. – Petriborg