<html><head><meta http-equiv="Content-Type" content="text/html charset=windows-1252"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">When I said “outside” I meant standalone function.<div>Moreover I see you’ve added property with the same functions. This won’t work. I would recommend you to look at docs -<a href="http://www.boost.org/doc/libs/1_55_0/libs/python/doc/tutorial/doc/html/python/exposing.html#python.constructors">http://www.boost.org/doc/libs/1_55_0/libs/python/doc/tutorial/doc/html/python/exposing.html#python.constructors</a><br><div><br></div><div>Valid wrap with untouched class declaration. </div><div><br></div><div><div>class Turtle</div><div>{</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>friend const PV& GetHeading(const Turtle& t);</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>friend const PV& GetLeft(const Turtle& t);</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>friend const P& GetPoint(const Turtle& t);</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>friend void SetPoint(Turtle& t, const P& p);</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>public:</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre"> </span>... </div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre"> </span>private:</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>PV h; </div><div><span class="Apple-tab-span" style="white-space:pre"> </span>PV l;</div><div>};</div><div><br></div><div><br></div><div>BOOST_PYTHON_MODULE(TurtleWrapper)</div><div>{</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>class_<Turtle>("Turtle") </div><div><span class="Apple-tab-span" style="white-space:pre"> </span>;</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre"> </span>def("GetHeading",&Turtle::GetHeading) </div><div><span class="Apple-tab-span" style="white-space:pre"> </span>def("GetLeft",&Turtle::GetLeft)</div><div>}</div></div><div><br></div><div>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:</div><div><br></div><div><div>#include <boost/python.hpp></div><div><br></div><div>struct PV{};</div><div>struct P{};</div><div><br></div><div>class Turtle</div><div>{</div><div>public:</div><div> const PV& GetHeading()</div><div> {</div><div> return mHeading;</div><div> }</div><div><br></div><div> const PV& GetLeft()</div><div> {</div><div> return mLeft;</div><div> }</div><div><br></div><div> const P& GetPoint()</div><div> {</div><div> return mPoint;</div><div> }</div><div><br></div><div> void SetPoint(const P& p)</div><div> {</div><div> mPoint = p;</div><div> }</div><div> </div><div>private:</div><div> PV mHeading, mLeft;</div><div> P mPoint;</div><div>};</div><div><br></div><div>using namespace boost::python;</div><div><br></div><div>BOOST_PYTHON_MODULE(TurtleWrapper)</div><div>{</div><div> class_<Turtle>("Turtle")</div><div> .add_property("Heading", make_function(&Turtle::GetHeading, return_internal_reference<>())) </div><div> .add_property("Left", make_function(&Turtle::GetLeft, return_internal_reference<>())) </div><div> .add_property("Point", make_function(&Turtle::GetPoint, return_internal_reference<>()), &Turtle::SetPoint) </div><div> ;</div><div>}</div></div><div><div><br></div></div><div><div><div>On 18 Jul 2014, at 15:37, Kv Gopalkrishnan <<a href="mailto:kvgopalkrishnan1@gmail.com">kvgopalkrishnan1@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div dir="ltr">Hi<div> 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 ?</div><div><br></div><div>Jim here is a concrete example.</div>
<div><br></div><div><br></div><div><div>#include <iostream></div><div>#include <mathsym.h></div><div>#include <P.h></div><div>#include <PV.h></div></div><div><br></div><div><div>using namespace std;</div>
<div>using namespace cxxadt;</div></div><div><br></div><div><br></div><div>class Turtle{<br></div><div> friend const PV& GetHeading(const Turtle& t);</div><div>public:<br></div><div> </div><div> Turtle(); </div>
<div> private:</div><div><br></div><div>PV h; <br></div><div><br></div><div>};</div><div><br></div><div>now corresponding to this the wrapper i wrote for this</div><div>
<pre style="margin-top:0px;margin-bottom:0px"><span style="color:rgb(0,0,128)">#include</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,128,0)"><iostream></span></pre>
<pre style="margin-top:0px;margin-bottom:0px"><span style="color:rgb(0,0,128)">#include</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,128,0)"><boost/python.hpp></span></pre>
<pre style="margin-top:0px;margin-bottom:0px"><span style="color:rgb(0,0,128)">#include</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,128,0)"><boost/python/module.hpp></span></pre>
<pre style="margin-top:0px;margin-bottom:0px"><span style="color:rgb(0,0,128)">#include</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,128,0)"><boost/python/def.hpp></span></pre>
<pre style="margin-top:0px;margin-bottom:0px"><span style="color:rgb(0,0,128)">#include</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,128,0)"><boost/python/scope.hpp></span></pre>
<pre style="margin-top:0px;margin-bottom:0px"><span style="color:rgb(0,0,128)">#include</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,128,0)"><boost/python/class.hpp></span></pre><pre style="margin-top:0px;margin-bottom:0px"><pre style="margin-top:0px;margin-bottom:0px"><span style="color:rgb(0,0,128)">#include</span><span style="color:rgb(0,128,0)">"Turtle.h"</span></pre><pre style="margin-top:0px;margin-bottom:0px"><span style="color:rgb(0,0,128)">#include</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,128,0)"><mathsym.h></span></pre>
<pre style="margin-top:0px;margin-bottom:0px"><span style="color:rgb(0,0,128)">#include</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,128,0)"><P.h></span></pre><pre style="margin-top:0px;margin-bottom:0px"><span style="color:rgb(0,0,128)">#include</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,128,0)"><PV.h></span></pre><pre style="margin-top:0px;margin-bottom:0px"><span style="color:rgb(0,128,0)"><br>
</span></pre><pre style="margin-top:0px;margin-bottom:0px"><pre style="margin-top:0px;margin-bottom:0px"><span style="color:rgb(128,128,0)">using</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(128,128,0)">namespace</span><span style="color:rgb(192,192,192)"> </span>std<span style="">;</span></pre>
<pre style="margin-top:0px;margin-bottom:0px"><span style="color:rgb(128,128,0)">using</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(128,128,0)">namespace</span><span style="color:rgb(192,192,192)"> </span>boost<span style="">::</span>python<span style="">;</span></pre>
<pre style="margin-top:0px;margin-bottom:0px"><span style="color:rgb(128,128,0)">using</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(128,128,0)">namespace</span><span style="color:rgb(192,192,192)"> </span>cxxadt<span style="">;</span></pre>
<pre style="margin-top:0px;margin-bottom:0px"><span style=""><br></span></pre><pre style="margin-top:0px;margin-bottom:0px"><span style=""><br></span></pre><pre style="margin-top:0px;margin-bottom:0px">
<pre style="margin-top:0px;margin-bottom:0px">BOOST_PYTHON_MODULE<span style="">(</span>TurtleWrapper<span style="">)</span></pre>
<pre style="margin-top:0px;margin-bottom:0px"><span style="">{</span></pre>
<pre style="margin-top:0px;margin-bottom:0px"><br></pre>
<pre style="margin-top:0px;margin-bottom:0px"><span style="color:rgb(192,192,192)"> </span>class_<span style=""><</span>Turtle<span style="">>(</span><span style="color:rgb(0,128,0)">"Turtle"</span><span style="">)</span><span style="color:rgb(192,192,192)"> </span></pre>
<pre style="margin-top:0px;margin-bottom:0px"><span style="color:rgb(192,192,192)"> </span><span style="font-family:arial;color:rgb(192,192,192)"> </span><span style="font-family: arial;">.</span><span style="font-family:arial">def</span><span style="font-family: arial;">(</span><span style="font-family:arial;color:rgb(0,128,0)">"GetHeading"</span><span style="font-family: arial;">,&</span><span style="font-family:arial">GetHeading</span><span style="font-family: arial;">)</span><span style="font-family:arial;color:rgb(192,192,192)"> ;</span></pre>
<pre style="margin-top:0px;margin-bottom:0px"><span style="font-family:arial;color:rgb(192,192,192)">}</span></pre><pre style="margin-top:0px;margin-bottom:0px"><span style="font-family:arial;color:rgb(192,192,192)"><br></span></pre>
<pre style="margin-top:0px;margin-bottom:0px"><pre style="margin-top:0px;margin-bottom:0px"><span style="color:rgb(192,192,192)"> </span>class_<span style=""><</span>PV<span style="">>(</span><span style="color:rgb(0,128,0)">"PV"</span><span style="">,</span>init<span style=""><</span><span style="color:rgb(128,128,0)">const</span><span style="color:rgb(192,192,192)"> </span>PV<span style="">>());</span><span style="color:rgb(192,192,192)"> </span></pre>
<pre style="margin-top:0px;margin-bottom:0px"><span style="color:rgb(192,192,192)"> </span>class_<span style=""><</span>P<span style="">>(</span><span style="color:rgb(0,128,0)">"P"</span><span style="">,</span>init<span style=""><</span><span style="color:rgb(128,128,0)">const</span><span style="color:rgb(192,192,192)"> </span>P<span style="">>())</span><span style="font-family: arial;">;</span></pre>
<pre style="margin-top:0px;margin-bottom:0px"><span style="font-family: arial;"><br></span></pre><pre style="margin-top:0px;margin-bottom:0px"><span style="font-family: arial;">}</span></pre>
<pre style="margin-top:0px;margin-bottom:0px"><br></pre>
<pre style="margin-top:0px;margin-bottom:0px"><br></pre>
<pre style="margin-top:0px;margin-bottom:0px"><br></pre></pre><pre style="margin-top:0px;margin-bottom:0px"><span style="font-family:arial;color:rgb(192,192,192)"><br></span></pre>
<pre style="margin-top:0px;margin-bottom:0px">Kind Regards</pre><pre style="margin-top:0px;margin-bottom:0px">KV</pre></pre></pre>
<pre style="margin-top:0px;margin-bottom:0px"><br></pre></pre></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div></div><div class="gmail_extra">
<br><br><div class="gmail_quote">On Fri, Jul 18, 2014 at 1:50 PM, Jim Bosch <span dir="ltr"><<a href="mailto:talljimbo@gmail.com" target="_blank">talljimbo@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class=""><p dir="ltr">On Jul 18, 2014 6:32 AM, "Kv Gopalkrishnan" <<a href="mailto:kvgopalkrishnan1@gmail.com" target="_blank">kvgopalkrishnan1@gmail.com</a>> wrote:<br>
><br>
> Hi Jim<br>
> Thank you for the answer. When I tried this solution <br>
> i.e. .def("GetHeading",&GetHeading) <br>
> error: ‘GetHeading’ was not declared in this scope<br>
><br>
><br>
> I get the above error.<br>
> 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?<br>
></p>
</div><p dir="ltr">I'm pretty sure that should have worked. Could you post a more complete example? I suspect the problem is elsewhere.</p><span class="HOEnZb"><font color="#888888"><p dir="ltr">Jim<br></p></font></span><div class="HOEnZb"><div class="h5"><p dir="ltr">><br>
> On Thu, Jul 17, 2014 at 3:12 PM, Jim Bosch <<a href="mailto:talljimbo@gmail.com" target="_blank">talljimbo@gmail.com</a>> wrote:<br>
>><br>
>> 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".<br>
>><br>
>> Jim<br>
>><br>
>><br>
>> On Wed, Jul 16, 2014 at 7:52 AM, Kv Gopalkrishnan <<a href="mailto:kvgopalkrishnan1@gmail.com" target="_blank">kvgopalkrishnan1@gmail.com</a>> wrote:<br>
>>><br>
>>> I want to expose a C++ friend functions to python using Python boost.<br>
>>> class Turtle{<br>
>>> friend const PV& GetHeading(const Turtle& t);<br>
>>> friend const PV& GetLeft(const Turtle& t);<br>
>>> friend const P& GetPoint(const Turtle& t);<br>
>>> friend void SetPoint(Turtle& t, const P& p);<br>
>>> public:<br>
>>> <br>
>>> ... <br>
>>> <br>
>>> private:<br>
>>> PV h; <br>
>>> PV l; <br>
>>><br>
>>> };<br>
>>><br>
>>><br>
>>> Here I have wrapped the classes PV and P so no problem there. I tried to wrap the friend functions like regular functions. Like<br>
>>><br>
>>> BOOST_PYTHON_MODULE(TurtleWrapper)<br>
>>> {<br>
>>> class_<Turtle>("Turtle") <br>
>>> .def("GetHeading",&Turtle::GetHeading) <br>
>>> .def("GetLeft",&Turtle::GetLeft)<br>
>>> .add_property("h",&Turtle::GetHeading)<br>
>>> .add_property("l",&Turtle::GetLeft);<br>
>>> }<br>
>>> When i run the code i get error messages.<br>
>>><br>
>>> error: ‘GetHeading’ is not a member of ‘Turtle’<br>
>>> error: ‘GetLeft’ is not a member of ‘Turtle’<br>
>>><br>
>>> This error is seen for add_property and also .def.<br>
>>> 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. <br>
>>><br>
>>> <br>
>>><br>
>>> Kind Regards<br>
>>> K.V.<br>
>>><br>
>>> _______________________________________________<br>
>>> Cplusplus-sig mailing list<br>
>>> <a href="mailto:Cplusplus-sig@python.org" target="_blank">Cplusplus-sig@python.org</a><br>
>>> <a href="https://mail.python.org/mailman/listinfo/cplusplus-sig" target="_blank">https://mail.python.org/mailman/listinfo/cplusplus-sig</a><br>
>><br>
>><br>
>><br>
>> _______________________________________________<br>
>> Cplusplus-sig mailing list<br>
>> <a href="mailto:Cplusplus-sig@python.org" target="_blank">Cplusplus-sig@python.org</a><br>
>> <a href="https://mail.python.org/mailman/listinfo/cplusplus-sig" target="_blank">https://mail.python.org/mailman/listinfo/cplusplus-sig</a><br>
><br>
><br>
><br>
><br>
> -- <br>
> K.V.<br>
><br>
> _______________________________________________<br>
> Cplusplus-sig mailing list<br>
> <a href="mailto:Cplusplus-sig@python.org" target="_blank">Cplusplus-sig@python.org</a><br>
> <a href="https://mail.python.org/mailman/listinfo/cplusplus-sig" target="_blank">https://mail.python.org/mailman/listinfo/cplusplus-sig</a><br>
</p>
</div></div><br>_______________________________________________<br>
Cplusplus-sig mailing list<br>
<a href="mailto:Cplusplus-sig@python.org">Cplusplus-sig@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/cplusplus-sig" target="_blank">https://mail.python.org/mailman/listinfo/cplusplus-sig</a><br></blockquote></div><br><br clear="all"><div><br></div>-- <br>K.V.
</div>
_______________________________________________<br>Cplusplus-sig mailing list<br><a href="mailto:Cplusplus-sig@python.org">Cplusplus-sig@python.org</a><br>https://mail.python.org/mailman/listinfo/cplusplus-sig</blockquote></div><br></div></div></body></html>