2009-06-02 8 views
2

Ich erstellte ein Lua-Modul mit einer sehr großen Anzahl von umschlossenen C++ - Klassen mit swig. Die Wrapper werden ohne Probleme generiert und kompiliert (mit -Wall). An einigen Stellen, die ich gefunden habe, stoße ich jedoch auf das folgende Problem: Die grundlegende Zuweisung von Mitgliedsdaten schlägt fehl.Grundlegende Zuordnung von Swig Wrapped Variablen schlägt fehl

Wenn ich laufen:

Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio 
> require('myModule') 
> a = myModule.ClassA() 

I kann dann überprüfen, ob der MetaTable auf "A" angebracht all seiner Mitgliedsdaten enthält (in diesem Fall Felder "b" und "c", der Klassentyp ClassB . und ClassC respectively)

I kann weiter tun:

> a.b = myModule.ClassB() 

die erfolgreich b auf eine neue Instanz von ClassB() neu zuweist. Allerdings, wenn ich gehe zu tun:

> a.b.c = myModule.ClassC() 

mir die Fehlermeldung:

Error in ClassB_c_set (arg 2), expected 'ClassC *' got 'ClassB *' 

Als ob der Ausdruck auf der rechten Seite des ‚=‘ war ein Ziel der gleichen Art wie die Element, das das Datenfeld enthält, das neu zugewiesen werden soll. Ich bin mir sicher, dass ich etwas Einfaches vermissen muss, aber ich habe meinen Kopf für ein paar Stunden gegen die Wand geschlagen, jetzt ohne Erfolg.

Hat jemand irgendwelche Gedanken? Vielen Dank!

Antwort

3

Es stellt sich heraus, dass dies ein Fehler in SWIG ist. Ich habe a bug report explaining the cause of the problem eingereicht.

Dieses Problem war eigentlich auf ein verschachteltes Namespace-Problem zurückzuführen, das mit einem Missverständnis darüber, wie SWIG meinerseits arbeitet, verbunden ist. Ich hatte angenommen, dass jeder Artikel, den ich über% include in meine Interface-Datei einbringe, so verarbeitet würde, wie gcc processes # includes. In SWIG-Dateien muss% jedoch in der Reihenfolge enthalten sein, in der auf den Inhalt verwiesen wird.

Weitere Informationen finden Sie im verlinkten Fehlerbericht.

0

Seien Sie immer sehr vorsichtig mit Zuweisungen mit SWIG! Beachten Sie, dass die -Operator =() Funktion nur für native Typen verwendet wird. Immer wenn Sie eigene Objekte zuweisen, wird nur die Adresse kopiert.

Lesen Sie mehr auf diesem Pfosten: SWIG C++ to Python: Warning(362): operator= ignored