On 9/14/07, <b class="gmail_sendername">Pertti Kellomäki</b> &lt;<a href="mailto:pertti.kellomaki@tut.fi">pertti.kellomaki@tut.fi</a>&gt; wrote:<div><span class="gmail_quote"></span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
I am exposing a largish library using Py++ and Boost.Python, and I&#39;m<br>running into a bit of a problem when I try to expose it in manageable<br>parts. I&#39;ve tried to condense the problem below.<br><br>One module contains class NIT:
<br><br>==================================================<br>class NIT : public IT {<br>public:<br>&nbsp;&nbsp;&nbsp;&nbsp; static NIT&amp; instance();<br>//...<br>}<br>==================================================<br><br>which is exposed by Py++ as follows:
<br><br>==================================================<br>struct NIT_wrapper : TT::NIT, bp::wrapper&lt; TT::NIT &gt; {<br>//...<br>};<br><br>BOOST_PYTHON_MODULE(mach){<br>&nbsp;&nbsp;&nbsp;&nbsp; bp::class_&lt; NIT_wrapper,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bp::bases&lt; TT::IT &gt;,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boost::noncopyable &gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; ( &quot;NIT&quot;, bp::no_init )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .def(&quot;instance&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , (::TT::NIT &amp; (*)(&nbsp;&nbsp;))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;( &amp;::TT::NIT::instance )<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , bp::return_value_policy&lt; bp::reference_existing_object<br> &gt;() )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .staticmethod( &quot;instance&quot; );<br>&nbsp;&nbsp;&nbsp;&nbsp; //...<br>==================================================<br><br>In another module, there is a member function that uses NIT as a default
<br>value:<br><br>==================================================<br>class I {<br>public:<br>&nbsp;&nbsp;&nbsp;&nbsp; I(const TT::IT&amp; iT = TT::NIT::instance());<br>&nbsp;&nbsp;&nbsp;&nbsp; //...<br>}<br>==================================================<br>
<br>This is exposed by Py++ as follows:<br><br>==================================================<br>BOOST_PYTHON_MODULE(program){<br>&nbsp;&nbsp;&nbsp;&nbsp; bp::class_&lt; TTAProgram::I,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boost::noncopyable &gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;( &quot;I&quot;,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bp::init&lt; bp::optional&lt; TT::IT const &amp; &gt; &gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (( bp::arg(&quot;iT&quot;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =TT::NIT::instance( ) )) )<br>&nbsp;&nbsp;&nbsp;&nbsp; //...<br>==================================================
<br><br>Importing the &quot;mach&quot; Python extension as<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;import TCE.base.mach<br><br>succeeds, but<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;import TCE.base.program<br><br>results in the error message<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Traceback (most recent call last):
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File &quot;&lt;stdin&gt;&quot;, line 1, in &lt;module&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TypeError: No to_python (by-value) converter found<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for C++ type: TTAMachine::NullInstructionTemplate<br><br>If I remove the default value from the signature, the problem
<br>disappears. Any ideas how to fix this?</blockquote><div><br>This is a Boost.Python limitation: you can&#39;t register function with default argument - it requires the type of the argument to be already registered. By importing the module  
TCE.base.mach you register the relevant class.<br><br>Take a look on next link:<br><a href="http://language-binding.net/pyplusplus/documentation/functions/default_args.html">http://language-binding.net/pyplusplus/documentation/functions/default_args.html
</a><br><br>HTH<br></div></div><br><br clear="all"><br>-- <br>Roman Yakovenko<br>C++ Python language binding<br><a href="http://www.language-binding.net/">http://www.language-binding.net/</a>