Hi,<div><br></div><div>Dirk, thanks for uploading the next version, because it does sort of help here. The error now with Rcpp 0.9.8 is &quot;expecting an external pointer&quot; from XPtr on the following very toy example. It has something to do with the type of SEXP in the constructor, but I am not very familiar with the Rcpp internals to be able to figure it out.<div>
<br></div><div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">#include &lt;Rcpp.h&gt;</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">class World {</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">public:</font></div>
<div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">    World() : msg(&quot;hello&quot;){}</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">    World(const std::string s) : msg(s){}</font></div>
<div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">    void set(std::string msg) { this-&gt;msg = msg; }</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">    std::string greet() const { return msg; }</font></div>
<div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">    void addMsg(const World w2) {</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">        this-&gt;msg = this-&gt;msg + w2.greet();</font></div>
<div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">    }</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">    World(SEXP x) {</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">        Rcpp::XPtr&lt;World&gt; ptr(x);</font></div>
<div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">        msg = ptr-&gt;greet();</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">   }</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">private:</font></div>
<div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">    std::string msg;</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">};</font></div><div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">RCPP_MODULE(yada){</font></div>
<div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">        using namespace Rcpp ;</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">        class_&lt;World&gt;( &quot;World&quot; )</font></div>
<div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">            .constructor()</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">            .constructor&lt;std::string&gt;()</font></div>
<div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">                .method( &quot;greet&quot;, &amp;World::greet , &quot;get the message&quot; )</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">                .method( &quot;set&quot;, &amp;World::set     , &quot;set the message&quot; )</font></div>
<div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">                .method( &quot;addMsg&quot;, &amp;World::addMsg  , &quot;add the message from another object&quot; );</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">}</font></div>
</div><div><br></div><div>And then in R:</div><div><div><br></div><div><font color="#cc0000" face="&#39;arial narrow&#39;, sans-serif">&gt;library(yada)</font></div><div><font color="#cc0000" face="&#39;arial narrow&#39;, sans-serif">&gt;a &lt;- new(World,&quot;this is a&quot;)</font></div>
<div><font color="#cc0000" face="&#39;arial narrow&#39;, sans-serif">&gt;b &lt;- new(World,&quot;this is b&quot;)</font></div><div><font color="#cc0000" face="&#39;arial narrow&#39;, sans-serif">&gt;a$addMsg(b)</font></div>
<div><font color="#cc0000" face="&#39;arial narrow&#39;, sans-serif">Error in a$addMsg(b) : expecting an external pointer</font></div></div><div><br></div>I&#39;d appreciate if someone could shed some light on it.</div><div>
<br></div><div>Thanks!</div><div><br><div class="gmail_quote">On Wed, Dec 21, 2011 at 7:52 PM, Yasir Suhail <span dir="ltr">&lt;<a href="mailto:yusuhail@gmail.com">yusuhail@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi,<div><br></div><div>Other than the approaches mentioned, I can also specialize an as&lt;World&gt;(SEXP) as<div><br></div><div><div>     template &lt;&gt;</div><div>     World as&lt;World&gt;(SEXP x) {</div><div><span style="white-space:pre-wrap">        </span>Rcpp::XPtr&lt;World&gt; ptr(x);</div>

<div><span style="white-space:pre-wrap">        </span>return World(ptr-&gt;greet());</div><div>     }</div><div><br></div><div>However, this also gives segfault at runtime when addMsg is called. The final code, with alternative implementations commented out for experimentation is:</div>

<div><br></div><div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">#include &lt;RcppCommon.h&gt;</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">#include &lt;string&gt;</font></div>
<div class="im">
<div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">class World {</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">public:</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">    World() : msg(&quot;hello&quot;){}</font></div>

</div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">    World(const std::string s) : msg(s){}</font></div><div class="im"><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">    void set(std::string msg) { this-&gt;msg = msg; }</font></div>

</div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">    std::string greet() const { return msg; }</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">    void addMsg(const World w2) {</font></div>

<div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif"><span style="white-space:pre-wrap">        </span>this-&gt;msg = this-&gt;msg + w2.greet();</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">    }</font></div>

<div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">//    World(SEXP x);</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">/*    World(SEXPREC* &amp;w2) {</font></div><div>
<font color="#006600" face="&#39;arial narrow&#39;, sans-serif"><span style="white-space:pre-wrap">        </span>msg = ((World*)w2)-&gt;greet();</font></div>
<div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">    }</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">*/</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">private: </font></div>

<div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">    std::string msg;</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">};</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">namespace Rcpp{</font></div>

<div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif"><br></font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">template &lt;&gt; SEXP wrap(const World&amp; object);</font></div>

<div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">template &lt;&gt; World as&lt;World&gt;(SEXP x);</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">}</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">#include &lt;Rcpp.h&gt;</font></div>

<div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif"><br></font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif"><br></font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">namespace Rcpp {</font></div>

<div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">     template &lt;&gt;</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">     SEXP wrap( const World&amp; object ){</font></div>

<div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">         Language call( &quot;new&quot;, Symbol( &quot;World&quot; ), object.greet() ) ;</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">         return call.eval() ;</font></div>

<div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">     }</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">     template &lt;&gt;</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">     World as&lt;World&gt;(SEXP x) {</font></div>

<div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif"><span style="white-space:pre-wrap">        </span>Rcpp::XPtr&lt;World&gt; ptr(x);</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif"><span style="white-space:pre-wrap">        </span>return World(ptr-&gt;greet());</font></div>

<div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">     }</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">}</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif"><br>

</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif"><br></font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">/*World::World(SEXP x) {</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif"><span style="white-space:pre-wrap">        </span>Rcpp::XPtr&lt;World&gt; ptr(x);</font></div>

<div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif"><span style="white-space:pre-wrap">        </span>msg = ptr-&gt;greet();</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">}*/</font></div>

<div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif"><br></font></div><div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">//...</font></div></div></div><div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif"><br>

</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">RCPP_MODULE(yada){</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif"><span style="white-space:pre-wrap">        </span>using namespace Rcpp ;</font></div>

</div><div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif"><span style="white-space:pre-wrap">        </span>class_&lt;World&gt;( &quot;World&quot; )</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif"><span style="white-space:pre-wrap">        </span>    // expose the default constructor</font></div>

<div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif"><span style="white-space:pre-wrap">        </span>    .constructor()</font></div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">            .constructor&lt;std::string&gt;()</font></div>

<div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif"><span style="white-space:pre-wrap">        </span>   <span style="white-space:pre-wrap">        </span>.method( &quot;greet&quot;, &amp;World::greet , &quot;get the message&quot; )</font></div>

<div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif"><span style="white-space:pre-wrap">                </span>.method( &quot;set&quot;, &amp;World::set     , &quot;set the message&quot; )</font></div>
<div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif"><span style="white-space:pre-wrap">                </span>.method( &quot;addMsg&quot;, &amp;World::addMsg  , &quot;add the message from another object&quot; );</font></div>

</div><div><font color="#006600" face="&#39;arial narrow&#39;, sans-serif">}</font></div><div><br></div><div>Then, running with R -d gdb</div><div><div>&gt; a &lt;- new(World,&quot;hello &quot;)</div><div>&gt; b &lt;- new(World,&quot;worlds&quot;)</div>

<div>&gt; a$greet( )</div><div>[1] &quot;hello &quot;</div><div>&gt; a$addMsg( b)</div><div><br></div><div>Program received signal EXC_BAD_ACCESS, Could not access memory.</div><div>Reason: KERN_INVALID_ADDRESS at address: 0x0000000011000078</div>

<div>0x00000001042032df in std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;::basic_string ()</div><div>(gdb) bt</div><div>#0  0x00000001042032df in std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;::basic_string ()</div>

<div>#1  0x0000000104358b18 in Rcpp::as&lt;World&gt; ()</div><div>#2  0x000000010435d564 in Rcpp::CppMethod1&lt;World, void, World&gt;::operator() ()</div><div>#3  0x000000010435eadb in Rcpp::class_&lt;World&gt;::invoke_void ()</div>

<div>#4  0x0000000104164670 in CppMethod__invoke_void ()</div><div>#5  0x00000001000928e9 in do_External ()</div><div>#6  0x00000001000c4af7 in Rf_eval ()</div><div>#7  0x00000001000c6d99 in do_begin ()</div><div>#8  0x00000001000c48af in Rf_eval ()</div>

<div>#9  0x00000001000c7cf3 in Rf_applyClosure ()</div><div>#10 0x00000001000c4778 in Rf_eval ()</div><div>#11 0x00000001000fed75 in Rf_ReplIteration ()</div><div>#12 0x00000001000ff021 in R_ReplConsole ()</div><div>#13 0x00000001000ff590 in run_Rmainloop ()</div>

<div>#14 0x0000000100000e8b in main ()</div><div>(gdb) </div></div><div><br></div><div>Thanks!</div></div><div><div class="h5"><br><div class="gmail_quote">On Wed, Dec 21, 2011 at 7:41 PM, Darren Cook <span dir="ltr">&lt;<a href="mailto:darren@dcook.org" target="_blank">darren@dcook.org</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello Yasir,<br>
Could you post your complete (minimal) code to the list. Then someone<br>
might be curious enough to try reproducing the problem.<br>
<span><font color="#888888"><br>
Darren<br>
</font></span><div><br>
<br>
On 2011-12-22 08:29, Yasir Suhail wrote:<br>
&gt; Thanks Darren, Douglas, Richard, and Dirk!<br>
&gt;<br>
&gt; I can compile with the following definitions:<br>
&gt;<br>
&gt; World(SEXP x) {<br>
&gt; Rcpp::XPtr&lt;World&gt; ptr(x);<br>
&gt; msg = ptr-&gt;msg;<br>
&gt; }<br>
<br>
</div>&gt; ...<br>
<div><div><br>
<br>
--<br>
Darren Cook, Software Researcher/Developer<br>
<br>
<a href="http://dcook.org/work/" target="_blank">http://dcook.org/work/</a> (About me and my work)<br>
<a href="http://dcook.org/blogs.html" target="_blank">http://dcook.org/blogs.html</a> (My blogs and articles)<br>
</div></div></blockquote></div><br></div></div></div>
</blockquote></div><br></div></div>