2017-03-10 5 views
1

Ich versuche SWIG eine C++ - Bibliothek zu Python SWIG. Eine der C++ Funktionen gibt einen shared_ptr zurück. Ich bin erfolgreich bei der Herstellung eines Python-Moduls, aber das von dieser Funktion an Python zurückgegebene Objekt scheint keine Mitglieder zu haben. Ist dies eine Einschränkung der Handhabung von shared_ptr durch SWIG oder mache ich etwas falsch? Dieseswig shared_ptr führt zu einem undurchsichtigen Objekt

ist in etwa die Struktur meines Code:

//foo.h 
namespace MyNamespace 
{ 
    class Base {}; 
    template <typename T> class Derived : public Base {}; 
    std::shared_ptr<Base> make_obj(); 
} 

SWIG:

//foo.i 
%module foo 
%include <std_shared_ptr.i> 

%{ 
    #define SWIG_FILE_WITH_INIT 
    #include "foo.h" 
%} 

%include "foo.h" 
%template(FooA) MyNamespace::Derived<MyNamespace::AAA>; 
%template(FooB) MyNamespace::Derived<MyNamespace::BBB>; 
%shared_ptr(MyNamespace::Base) 
%shared_ptr(FooA) 
%shared_ptr(FooB) 

Antwort

1

Ich denke, man die Ordnung der Dinge haben hier ein wenig falsch. Beachten Sie, dass in allen Beispielen in der Dokumentation shared_ptr sie %shared_ptr aufrufen, bevor überhaupt eine Deklaration/Definition dieses Typs angezeigt wird.

Mit den Vorbehalte kommentiert über die %shared_ptr Direktive und die FooA/FooB Vorlage Instanzen korrigiert für ich glaube, etwas wie das sollte für Ihr Beispiel funktionieren.

//foo.i 
%module foo 
%include <std_shared_ptr.i> 

%{ 
    #define SWIG_FILE_WITH_INIT 
    #include "foo.h" 
%} 


%shared_ptr(MyNamespace::Base) 
%shared_ptr(FooA) // This should probably be MyNamespace::Derived<...> 
%shared_ptr(FooB) // This should probably be the fully qualified C++ type also 

%include "foo.h" 

%template(FooA) MyNamespace::Derived<MyNamespace::AAA>; 
%template(FooB) MyNamespace::Derived<MyNamespace::BBB>; 
+0

Vielen Dank. Das war in der Tat das Problem. Die Inline-Kommentare sind ebenfalls korrekt. – BlindDriver

Verwandte Themen