[Cython] Cannot assign type 'set<size_t> &' to 'set<size_t>'

Dimitri Tcaciuc dtcaciuc at gmail.com
Sun Jan 15 19:01:43 CET 2012


Hi folks,

Since the original question, I've created a pull request with a
failing test and tried to get some discussion going, but so far no
answer. I'm a tad discouraged, since obviously there's movement on
mail list and with pull requests. Is a pull request a proper way to do
this? I completely understand if you guys don't have enough available
time to deal with it right now, however at least some acknowledgement
and feedback would be much appreciated.

Thanks,


Dimitri.

On Sun, Dec 18, 2011 at 8:17 PM, Dimitri Tcaciuc <dtcaciuc at gmail.com> wrote:
> Hello everyone,
>
> Here's a small test case I'm trying to compile. I'm trying to pass a
> STL set reference to a method in a template class.
>
> x.pyx:
>
>    from libcpp.set cimport set as cpp_set
>
>    cdef extern from "x.hh":
>
>        cdef cppclass Foo [T]:
>            Foo()
>            void set_x(cpp_set[size_t] & x)
>
>    cpdef func():
>        cdef Foo[int] foo
>
>        cdef cpp_set[size_t] x
>        cdef cpp_set[size_t] & xref = x
>
>        foo.set_x(xref)
>
> x.hh:
>
>    #include <set>
>
>    template <typename T>
>    struct Foo {
>        void set_x(const std::set<size_t> & x) { /* do nothing */ }
>    };
>
> To compile,
>
>    bash $ cython --cplus x.pyx
>
> Which results in
>
>    foo.set_x(xref)
>                 ^
> ------------------------------------------------------------
> x.pyx:15:18: Cannot assign type 'set<size_t> &' to 'set<size_t>'
>
>
> However, if I remove the template parameter from Foo, everything works.
>
>
> y.pyx:
>
>    from libcpp.set cimport set as cpp_set
>
>    cdef extern from "y.hh":
>
>        cdef cppclass Foo:
>            Foo()
>            void set_x(cpp_set[size_t] & x)
>
>    cpdef func():
>        cdef Foo foo
>
>        cdef cpp_set[size_t] x
>        cdef cpp_set[size_t] & xref = x
>
>        foo.set_x(xref)
>
> y.hh:
>
>    #include <set>
>
>    struct Foo {
>        void set_x(const std::set<size_t> & x) { /* do nothing */ }
>    };
>
>
> From what I can tell, the CppClassType instance the CReferenceType is
> pointing to has the correct name "set<size_t>", however it's a
> different class instance. The particular failing expression is in
> `ExprNode.coerce_to`
>
>    if not (str(src.type) == str(dst_type) or
> dst_type.assignable_from(src_type))
>
>
> I wish I could suggest a patch, but unfortunately I'm a complete
> newbie to Cython internals. Perhaps someone could give a few pointers
> as to what should be done to fix this?
>
> Thanks,
>
>
> Dimitri


More information about the cython-devel mailing list