<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>