[C++-sig] Exposing Friend Functions in C++ Python Boost

Kv Gopalkrishnan kvgopalkrishnan1 at gmail.com
Fri Jul 18 13:37:31 CEST 2014


Hi
   Thanks Michael For the answer however I am a bit confused about the
solution you gave. Do you mean to remove the GetHeading function and paste
it outside  class Turtle ?

Jim here is a concrete example.


#include <iostream>
#include <mathsym.h>
#include <P.h>
#include <PV.h>

using namespace std;
using namespace cxxadt;


class Turtle{
      friend const PV& GetHeading(const Turtle& t);
public:

  Turtle();
  private:

PV h;

};

now corresponding to this the wrapper i wrote for this

#include <iostream>

#include <boost/python.hpp>

#include <boost/python/module.hpp>

#include <boost/python/def.hpp>

#include <boost/python/scope.hpp>

#include <boost/python/class.hpp>

#include"Turtle.h"

#include <mathsym.h>

#include <P.h>

#include <PV.h>


using namespace std;

using namespace boost::python;

using namespace cxxadt;



BOOST_PYTHON_MODULE(TurtleWrapper)

{


    class_<Turtle>("Turtle")

               .def("GetHeading",&GetHeading) ;

}


  class_<PV>("PV",init<const PV>());

    class_<P>("P",init<const P>());


}





Kind Regards

KV













On Fri, Jul 18, 2014 at 1:50 PM, Jim Bosch <talljimbo at gmail.com> wrote:

> On Jul 18, 2014 6:32 AM, "Kv Gopalkrishnan" <kvgopalkrishnan1 at gmail.com>
> wrote:
> >
> > Hi Jim
> >           Thank you for the answer. When I tried this solution
> > i.e.  .def("GetHeading",&GetHeading)
> > error: ‘GetHeading’ was not declared in this scope
> >
> >
> > I get the above error.
> > Stating the obvious the error  says function was not described in the
> scope. Seems a bit nasty business is it so that I would have to write a get
> function in someway in to public domain to get the function wrapped in to
> boost?
> >
>
> I'm pretty sure that should have worked.  Could you post a more complete
> example?  I suspect the problem is elsewhere.
>
> Jim
>
> >
> > On Thu, Jul 17, 2014 at 3:12 PM, Jim Bosch <talljimbo at gmail.com> wrote:
> >>
> >> The problem here is actually a  C++ issue, not a Boost.Python one.
>  Friend functions aren't considered to be part of the scope of the class
> that they're friends with, so when referring to them, just use e.g.
> "&GetHeading", not "&Turtle::GetHeading".
> >>
> >> Jim
> >>
> >>
> >> On Wed, Jul 16, 2014 at 7:52 AM, Kv Gopalkrishnan <
> kvgopalkrishnan1 at gmail.com> wrote:
> >>>
> >>> I want to expose a C++ friend functions to python using Python boost.
> >>>   class Turtle{
> >>>                    friend const PV& GetHeading(const Turtle& t);
> >>>                    friend const PV& GetLeft(const Turtle& t);
> >>>                    friend const P& GetPoint(const Turtle& t);
> >>>                    friend void SetPoint(Turtle& t, const P& p);
> >>>                    public:
> >>>
> >>>                    ...
> >>>
> >>>                    private:
> >>>                    PV h;
> >>>                    PV l;
> >>>
> >>>               };
> >>>
> >>>
> >>> Here I have wrapped the classes PV and P so no problem there. I tried
> to wrap the friend functions like regular functions. Like
> >>>
> >>>               BOOST_PYTHON_MODULE(TurtleWrapper)
> >>>                   {
> >>>                      class_<Turtle>("Turtle")
> >>>                        .def("GetHeading",&Turtle::GetHeading)
> >>>                        .def("GetLeft",&Turtle::GetLeft)
> >>>                        .add_property("h",&Turtle::GetHeading)
> >>>                        .add_property("l",&Turtle::GetLeft);
> >>>                  }
> >>> When i run the code i get error messages.
> >>>
> >>>                error: ‘GetHeading’ is not a member of ‘Turtle’
> >>>                error: ‘GetLeft’ is not a member of ‘Turtle’
> >>>
> >>> This error is seen for add_property and also .def.
> >>> So I assume that this is not the way to declare a friend function and
> the documentation of python boost does not seem (or at least I did not see
> a note about friend functions). Any help is much appreciated.
> >>>
> >>>
> >>>
> >>> Kind Regards
> >>> K.V.
> >>>
> >>> _______________________________________________
> >>> Cplusplus-sig mailing list
> >>> Cplusplus-sig at python.org
> >>> https://mail.python.org/mailman/listinfo/cplusplus-sig
> >>
> >>
> >>
> >> _______________________________________________
> >> Cplusplus-sig mailing list
> >> Cplusplus-sig at python.org
> >> https://mail.python.org/mailman/listinfo/cplusplus-sig
> >
> >
> >
> >
> > --
> > K.V.
> >
> > _______________________________________________
> > Cplusplus-sig mailing list
> > Cplusplus-sig at python.org
> > https://mail.python.org/mailman/listinfo/cplusplus-sig
>
> _______________________________________________
> Cplusplus-sig mailing list
> Cplusplus-sig at python.org
> https://mail.python.org/mailman/listinfo/cplusplus-sig
>



-- 
K.V.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/cplusplus-sig/attachments/20140718/e25074de/attachment.html>


More information about the Cplusplus-sig mailing list