2016-07-24 5 views
0

Ich habe eine Funktion in C++ geschrieben und erfolgreich gebaut.Boost Python C++ - Funktion einen anderen Funktionsfehler aufrufen

Allerdings, wenn ich es gerade von einer anderen Funktion in C++ aufrufen, dann ist der Build fehlgeschlagen.

double getlistvalue(boost::python::list l, int index) 
{ 
    if (index = -1) 
     return 0; 
    else 
     return boost::python::extract<double>(l[index]); 

} 

double xx(boost::python::list l, int index) 
{ 
    return getlistvalue(l, index); 
} 

der obige Code, ohne die zweite Funktion, es baut.

hier ist der Fehler Info: error info

Bitte Ideen teilen, wie es zu lösen. Danke vielmals.

Antwort

1

Sie übergeben die Listen nach Wert, was einen Kopierkonstruktor erfordert. Die Fehlermeldung besagt, dass kein Kopierkonstruktor für die Liste bereitgestellt wurde. Die Lösung ist daher die Liste unter Bezugnahme auf passieren:

double getlistvalue(const boost::python::list &l, int index) 

(und das gleiche gilt für die andere Funktion).

Im Allgemeinen ist die Übergabe komplexer Objekte wie eine Liste nach Wert keine gute Idee, da selbst wenn ein Kopierkonstruktor bereitgestellt wurde, die eigentliche Erstellung der Kopie ziemlich teuer sein kann.

+0

vielen dank für die antwort, ihre antwort ist richtig, wird das problem zu lösen. Gefunden, dass eine andere Möglichkeit ist, #define BOOST_PYTHON_STATIC_LIB vor dem Einfügen der Boost/Python-Header hinzuzufügen. Nur für Leute, die ähnliche Probleme haben. – datalearning

+0

@datalearning Die Python-Liste hat einen Kopierkonstruktor. Wie Sie festgestellt haben, weisen die Fehlermeldungen (nicht aufgelöste Symbole) darauf hin, dass eine Verknüpfung mit der Boost.Python-Bibliothek mit der entsprechenden Sichtbarkeit des Symbols erforderlich ist. Python-Objekte werden als Referenz gezählt, und Boost.Python-Objekte sind im Wesentlichen intelligente Zeiger. Infolgedessen ist das Übergeben dieser Objekte nach Wert billig. –

Verwandte Themen