When I said “outside” I meant standalone function. Moreover I see you’ve added property with the same functions. This won’t work. I would recommend you to look at docs -http://www.boost.org/doc/libs/1_55_0/libs/python/doc/tutorial/doc/html/python/exposing.html#python.constructors
Valid wrap with untouched class declaration. 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; }; BOOST_PYTHON_MODULE(TurtleWrapper) { class_<Turtle>("Turtle") ; def("GetHeading",&Turtle::GetHeading) def("GetLeft",&Turtle::GetLeft) } Anyway I would recommend you not to use friend functions to get something from private section of class. If you’ll make methods your code will be cleaner. Working code: #include <boost/python.hpp> struct PV{}; struct P{}; class Turtle { public: const PV& GetHeading() { return mHeading; } const PV& GetLeft() { return mLeft; } const P& GetPoint() { return mPoint; } void SetPoint(const P& p) { mPoint = p; } private: PV mHeading, mLeft; P mPoint; }; using namespace boost::python; BOOST_PYTHON_MODULE(TurtleWrapper) { class_<Turtle>("Turtle") .add_property("Heading", make_function(&Turtle::GetHeading, return_internal_reference<>())) .add_property("Left", make_function(&Turtle::GetLeft, return_internal_reference<>())) .add_property("Point", make_function(&Turtle::GetPoint, return_internal_reference<>()), &Turtle::SetPoint) ; } On 18 Jul 2014, at 15:37, Kv Gopalkrishnan <kvgopalkrishn...@gmail.com> wrote: > 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 <tallji...@gmail.com> wrote: > On Jul 18, 2014 6:32 AM, "Kv Gopalkrishnan" <kvgopalkrishn...@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 <tallji...@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 > >> <kvgopalkrishn...@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@python.org > >>> https://mail.python.org/mailman/listinfo/cplusplus-sig > >> > >> > >> > >> _______________________________________________ > >> Cplusplus-sig mailing list > >> Cplusplus-sig@python.org > >> https://mail.python.org/mailman/listinfo/cplusplus-sig > > > > > > > > > > -- > > K.V. > > > > _______________________________________________ > > Cplusplus-sig mailing list > > Cplusplus-sig@python.org > > https://mail.python.org/mailman/listinfo/cplusplus-sig > > _______________________________________________ > Cplusplus-sig mailing list > Cplusplus-sig@python.org > https://mail.python.org/mailman/listinfo/cplusplus-sig > > > > -- > K.V. > _______________________________________________ > Cplusplus-sig mailing list > Cplusplus-sig@python.org > https://mail.python.org/mailman/listinfo/cplusplus-sig
_______________________________________________ Cplusplus-sig mailing list Cplusplus-sig@python.org https://mail.python.org/mailman/listinfo/cplusplus-sig