Ich habe den folgenden Code in meinem Cython Wrapper zu einem C++ Code:Cython - wie man richtig Betreiber in Verbindung mit Referenzen
# distutils: language = c++
# distutils: sources = symbolic.cpp
from libcpp.vector cimport vector
from libcpp.pair cimport pair
from libcpp.string cimport string
from libcpp cimport bool
cdef extern from "symbolic.h" namespace "metadiff::symbolic":
cdef cppclass SymbolicMonomial:
vector[pair[int, int]] powers
long long coefficient;
SymbolicMonomial()
SymbolicMonomial(long)
SymbolicMonomial(const SymbolicMonomial&)
bool is_constant()
long long int eval(vector[int]&)
long long int eval()
string to_string()
string to_string_with_star() const
cdef SymbolicMonomial mul_mm"operator*"(const SymbolicMonomial&, const SymbolicMonomial&)
# SymbolicMonomial operator*(long long, const SymbolicMonomial&)
# SymbolicMonomial operator*(const SymbolicMonomial&, long long)
cdef class SymMonomial:
cdef SymbolicMonomial* thisptr # hold a C++ instance which we're wrapping
def __cinit__(self):
self.thisptr = new SymbolicMonomial()
def __cinit__(self, int value):
self.thisptr = new SymbolicMonomial(value)
def __dealloc__(self):
del self.thisptr
def is_constant(self):
return self.thisptr.is_constant()
def eval(self):
return self.thisptr.eval()
def __str__(self):
return self.to_string_with_star()
def to_string(self):
return self.thisptr.to_string().decode('UTF-8')
def to_string_with_star(self):
return self.thisptr.to_string_with_star().decode('UTF-8')
def __mul__(self, other):
return mul_mm(self.thisptr, other)
def variable(variable_id):
monomial = SymMonomial()
monomial.thisptr.powers.push_back((variable_id, 1))
return monomial
Allerdings habe ich es nie heraus, wie richtig die mul_mm
Methode aufzurufen. Es sagt weiter Cannot convert 'SymbolicMonomial' to Python object
oder umgekehrt. Die Sache ist, dass ich auf diese Weise zwei SymMonomials multiplizieren kann. Aber aus irgendeinem Grund kann ich nicht verstehen, wie man es richtig macht. Irgendwelche Ratschläge?
Hey, ich denke, dass Ihr Vorschlag einige der Probleme gelöst hat. Ich bekomme aber immer noch das: '' '/home/alex/work/c/swig_test/symbolic.h: 298: Mehrfachdefinition von' metadiff :: symbolic :: operator * (metadiff :: symbolic :: SymbolicMonomial const & , metadiff :: symbolic :: SymbolicMonomial const &) ' '' ', wegen der Umbenennung mul_mm. Hast du eine Idee, warum das passiert? Ich habe Wache in meiner Header-Datei, aber aus irgendeinem Grund scheint es, es zweimal aufzunehmen? –
Eigentlich habe ich das Problem gefunden. –