Поддержка SWIG для наследования статических функций-членов - PullRequest
5 голосов
/ 20 июня 2010

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

Так что при загрузке 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 Ответ

2 голосов
/ 20 июня 2010

Статическая функция определена только в родительском class B правильно?как в:

D::stat();

Не правильно ли вызывается?Вот почему SWIG не переносит функцию ...

Что касается того, как вы можете получить доступ к функции, SWIG позволяет добавлять / скрывать / переносить функции из любого класса, который вы хотите, так что это будетможно "исправить" класс SWIG для предоставления доступа к stat().

. Поверьте, синтаксис выглядит примерно так:

%extend D {
   ...
}

Давно я не касался SWIG, поэтому ячто-то запомнил.

...