[C++-sig] Re: yet another: TypeError: No to_python (by-value) converter found for C++ type:

tALSit de CoD talsit at talsit.org
Tue Aug 24 07:55:50 CEST 2004


I've writen up a complete file that demostraits what i'm trying to do,
i've posted it up here:
http://talsit.org/image/boost_python_test.cpp

Basically, i have an object (class B) that has a std::vector <A*>. If i
return a reference to that vector, how can i iterate through it. If i do
it with the straight iterator method, like i do with other basic data
types (unsigned int), it complains about not been able to convert from A
*. If i do it with the range method as suggested, it says that it can
convert from A.

Thing is, I don't know if i'm even doing the range method correctly.

Hope this explains my problem better.

Thanks a lot in advance


> Thanks David....
>
> I understand it more now, but, from what I've been trying to implement, it
> still doesnt work.
>
> Here's a simplification of the problem:
>
> class A {
> public:
>   const std::string & getName ();
> private:
>   std::string m_name;
> };
>
> class B {
> public:
>   const std::vector <A *> & getAs () { return m_listOfA; }
> private:
>   std::vector <A *> m_listOfA;
> };
>
> Now, i try to export the classes:
>
> boost::indirect_iterator <std::vector <A *>::iterator>
> 	ABegin (std::vector <A *> & v) {
> 		return boost::make_indirect_iterator (v.begin ());
> };
>
> boost::indirect_iterator <std::vector <A *>::iterator>
> 	AEnd (std::vector <A *> & v) {
> 		return boost::make_indirect_iterator (v.end ());
> };
>
>
> BOOST_PYTHON_MODULE (kikura) {
> 	class_ <A> ("A")
> 		.def ("getName", &A::getName, return_internal_reference <> ())
> 	;
>
> 	class_ <B> ("B")
> 		.def ("getAs", &B::getAs, return_internal_reference <> ())
> 	;
>
> 	//----------------------------------------------------------------
> 	class_ <std::vector <A *> > ("AList")
> 		.def("__iter__", range (ABegin, AEnd))
> 	;
>
> }
>
> Now, that will fail, and say that:
>
> TypeError: No to_python (by-value) converter found for C++ type: class A
>
> If I didn't use the range method, it would give me this:
>
> TypeError: No to_python (by-value) converter found for C++ type: class A*
>
> Any clues?
>
> Thanks for all help...
>
>
>> "tALSit de CoD" <talsit at talsit.org> writes:
>>
>>> Hmm... i've been trying to understand it, i've read the docs... but...
>>> ummm... i can't quite understand it very well...
>>>
>>> Does this mean that when my class does:
>>>
>>> const std::vector <cNodeDescriptor *> cRegistry::getDescriptors ();
>>>
>>> i have to replace that with this:
>>>
>>> boost::indirect_iterator<std::vector<cNodeDescriptor*>::iterator>
>>> cRegistry::getDescriptors ();
>>
>> I have no idea what getDescriptors is, so it's hard to comment.
>>
>>> Or am i just totally missing the point?
>>>
>>> Most of the template magic voodoo still baffels me... :D
>>
>> There's no template magic voodoo to understand this.
>>
>>   Try using range
>>   (http://www.boost.org/libs/python/doc/v2/iterator.html#range-spec)
>>
>> Do you understand what range does?
>>
>>    with functions that return
>>    boost::indirect_iterator<std::vector<cNodeDescriptor*>::iterator>
>>    wrapped around the vector's begin() and end().
>>    (http://www.boost.org/libs/iterator/doc/indirect_iterator.html)
>>
>> By this I mean
>>
>>   boost::indirect_iterator<std::vector<cNodeDescriptor*>::iterator>
>>   my_begin(std::vector<cNodeDescriptor*>& v)
>>   {
>>        return boost::make_indirect_iterator(v.begin());
>>   };
>>
>>   boost::indirect_iterator<std::vector<cNodeDescriptor*>::iterator>
>>   my_end(std::vector<cNodeDescriptor*>& v)
>>   {
>>        return boost::make_indirect_iterator(v.end());
>>   };
>>
>> so, something like:
>>
>>   class_ <std::vector <cNodeDescriptor *> > ("cNodeDescriptorList")
>> 	  .def("__iter__", range(my_begin, my_end))
>>       ;
>>
>>
>> HTH,
>>
>> --
>> Dave Abrahams
>> Boost Consulting
>> http://www.boost-consulting.com
>>
>> _______________________________________________
>> C++-sig mailing list
>> C++-sig at python.org
>> http://mail.python.org/mailman/listinfo/c++-sig
>>
>>
>
>
> // talsit.org
>
>
>
> _______________________________________________
> C++-sig mailing list
> C++-sig at python.org
> http://mail.python.org/mailman/listinfo/c++-sig
>
>


// talsit.org



More information about the Cplusplus-sig mailing list