On 28.02.2013 13:58, Yury V. Zaytsev wrote:
Hi,
I'm sorry if my question would appear to be trivial, but what am I
supposed to do, if I want to wrap class methods, that return a reference
to another class?
From reading the list, I've gathered that apparently the best strategy
of dealing with references is just to not to use them (convert to
pointers immediately), because of some scoping rules issues.
It works for me for a simple case of POD types, like
cdef extern from "test.h":
int& foo()
cdef int* x = &foo()
but in a more complex case, Cython generates incorrect C++ code (first
it declares a reference, then assigns to it, which, of course, doesn't
even compile):
cdef extern from "token.h":
cppclass Token:
Token(const Datum&) except +
cdef extern from "tokenstack.h":
cppclass TokenStack:
Token& top() except +
cdef Token* tok = &self.pEngine.OStack.top()
<->
Token *__pyx_v_tok;
Token &__pyx_t_5;
__pyx_t_5 = __pyx_v_self->pEngine->OStack.top();
__pyx_v_tok = (&__pyx_t_5);
This is clearly a bug in Cython. The generated code should be:
Token *__pyx_v_tok;
Token &__pyx_t_5 = __pyx_v_self->pEngine->OStack.top();
__pyx_v_tok = (&__pyx_t_5);
One cannot let a C++ reference dangle:
Token &__pyx_t_5; // illegal C++
Sturla
_______________________________________________
cython-devel mailing list
cython-devel@python.org
http://mail.python.org/mailman/listinfo/cython-devel