2016-06-27 8 views
0

Ich verpacke C++ - Code mit SWIG für eine Android-Anwendung. Ich stehe vor einem Problem, wenn ich eine Klasse nutze, die privat von einer anderen erbt, und ein paar using Direktiven dorthin schmeiße, um einige der Member-Funktionen der Eltern freizulegen. Sieht wie folgt aus:Die privaten Basisklassen-Memberfunktionen im SWIG-Wrapper können nicht angezeigt werden.

#include "Bar.h" 

class Foo : private Bar { 

//Stuff Foo-specific... 

public: 
    using Bar::baz; 
}; 

Die Sache ist, wenn ich SWIG laufen, ich folgende Meldung während des Wickel erhalten:

foo.h: 8: Warnung 315: Nichts über ‚Bar bekannt: : baz() '.

Hinweis: Die beiden Header in der Wrapper-Datei enthalten sind, nur der Foo Kopf gewickelt ist, wie ich will nicht den Bar Kopf gewickelt werden, meine .i Datei wie folgt aussieht:

%{ 
    #include "Bar.h" 
    #include "Foo.h" 
%} 

%include "Foo.h" 

dann wird meine Java-Klasse nicht kompilieren, weil es nicht mit diesem Symbol findet ...

las ich in der SWIG Dokumentation, dass private inheritance und die using keyword (obwohl es kein Beispiel über private Vererbung) supp sind sollte unterstützt werden, also was fehlt mir hier?

Antwort

1

Zuerst sollte Ihre using Anweisung using Bar::baz; sein.

Wie SWIG sagt in der Warnung, kann es Foo::baz() nicht wickeln, wenn es die Deklaration in Bar::baz() nicht kennt.

Daher müssen Sie die Deklaration für SWIG z. B. durch eine %include "Bar.h"-Anweisung anzeigen. Wenn Sie nicht möchten, dass Bar umgebrochen wird, können Sie eine zusätzliche %ignore Bar; Direktive verwenden.

ist hier ein minimales Arbeitsbeispiel:

%ignore Bar; 
%inline %{ 
class Bar { 
public: 
    double baz() { return 4.2; } 
}; 
class Foo : private Bar { 
public: 
    using Bar::baz; 
}; 
%} 
+0

Ah, um die '% ignore' Richtlinie in der Tat vergessen. Ich dachte auch, dass das "include" ausreichen würde, da es nur die Erklärung benötigt, aber anscheinend falsch war ... Danke! – JBL

Verwandte Themen