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