<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 12 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0cm;
        margin-right:0cm;
        margin-bottom:0cm;
        margin-left:36.0pt;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-AU" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-US">Hi All,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Thanks for your previous help on </span><a href="http://comments.gmane.org/gmane.comp.lang.r.rcpp/5972">http://comments.gmane.org/gmane.comp.lang.r.rcpp/5972</a><o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I have been able to implement an RCPP_MODULE of the “real code” containing classes represented by classes A and B in the above thread. That set/group of classes implements a generic base class that will be extended from to provide particular
 functionality.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I now wish to expose via RCPP_MODULE a class A_derived which derives from A<B_derived>. I want to expose member variable var1 and function fun1 of class A_derived which are both inherited from A<B_derived>. i.e. no overwriting definition
 of A_derived::var1 or A_derived::fun1 exist, only A<B_derived>::var1 and A<B_derived>::fun1.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">However, the following RCPP_MODULE definition produces the subsequent compiler error.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">RCPP_MODULE(testing) {<o:p></o:p></p>
<p class="MsoNormal">    class_<A_derived>("A_derived")<o:p></o:p></p>
<p class="MsoNormal">    .field( "var1", &A_derived::var1)<o:p></o:p></p>
<p class="MsoNormal">    .method("fun1", &A_derived::fun1)<o:p></o:p></p>
<p class="MsoNormal">    ;<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">test2.cpp: In function 'void _rcpp_module_testing_init()':<o:p></o:p></p>
<p class="MsoNormal">test2.cpp:33:37: error: no matching function for call to 'Rcpp::class_<A_derived>::field(const char [5], double A<B_derived>::*)'<o:p></o:p></p>
<p class="MsoNormal">test2.cpp:33:37: note: candidate is:<o:p></o:p></p>
<p class="MsoNormal">C:/.../R/win-library/3.0/Rcpp/include/Rcpp/module/Module_Field.h:68:7: note: template<class T> Rcpp::class_<Class>::self& Rcpp::class_::field(const char*, T Class::*, const char*) [with T = T, Class = A_derived, Rcpp::class_<Class>::self
 = Rcpp::class_<A_derived>]<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">It seems the compiler is converting A_derived::var1 and fun1 into their true references A<B_derived>::var1 and fun1, but the Rcpp templates cannot handle the situation where the referenced variable or function is not a “proper” member of
 the class.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">However, the error goes away if overwrite var1 and fun1 in A_derived, and implement A_derived::fun1() as:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">void A_derived::fun1() {<o:p></o:p></p>
<p class="MsoNormal">    A<B_derived>::fun1();<o:p></o:p></p>
<p class="MsoNormal">};<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">This is not ideal.<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">Can someone please help me formulate the correct RCPP_MODULE definition? Is there something that I am doing wrong, or have I once again triggered a chain of the template meta program that is not implemented in Rcpp.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Full code and error reduct follows:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">-----test2.cpp-----<o:p></o:p></p>
<p class="MsoNormal">#include <RcppCommon.h><o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">class B {<o:p></o:p></p>
<p class="MsoNormal">    public:<o:p></o:p></p>
<p class="MsoNormal">        B (SEXP b);<o:p></o:p></p>
<p class="MsoNormal">};<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">template <class T> class A {<o:p></o:p></p>
<p class="MsoNormal">    public:<o:p></o:p></p>
<p class="MsoNormal">        double var1;<o:p></o:p></p>
<p class="MsoNormal">        void fun1();<o:p></o:p></p>
<p class="MsoNormal">};<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">class B_derived : public B {<o:p></o:p></p>
<p class="MsoNormal">    public:<o:p></o:p></p>
<p class="MsoNormal">        B_derived(SEXP b);<o:p></o:p></p>
<p class="MsoNormal">};<o:p></o:p></p>
<p class="MsoNormal">class A_derived : public A<B_derived> {};<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#include <Rcpp.h><o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">B::B(SEXP b) {};<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">template <class T> void A<T>::fun1(){<o:p></o:p></p>
<p class="MsoNormal">    Rcpp::Rcout << "Object of Type: " << typeid(this).name() << "\n";<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">B_derived::B_derived(SEXP b) : B::B(b) {};<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">using namespace Rcpp;<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">RCPP_MODULE(testing) {<o:p></o:p></p>
<p class="MsoNormal">    class_<A_derived>("A_derived")<o:p></o:p></p>
<p class="MsoNormal">    .field( "var1", &A_derived::var1)<o:p></o:p></p>
<p class="MsoNormal">    .method("fun1", &A_derived::fun1)<o:p></o:p></p>
<p class="MsoNormal">    ;<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal">----end test2.cpp----<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">> require(R)<o:p></o:p></p>
<p class="MsoNormal">> sourceCpp(file="test2.cpp", verbose=TRUE)<o:p></o:p></p>
<p class="MsoNormal">...snip...<o:p></o:p></p>
<p class="MsoNormal">g++ -m32 -I"C:/PROGRA~1/R/R-30~1.1/include" -DNDEBUG     -I"C:/.../R/win-library/3.0/Rcpp/include"  -I"d:/RCompile/CRANpkg/extralibs64/local/include"     -O2 -Wall  -mtune=core2 -c test2.cpp -o test2.o<o:p></o:p></p>
<p class="MsoNormal">test2.cpp: In function 'void _rcpp_module_testing_init()':<o:p></o:p></p>
<p class="MsoNormal">test2.cpp:33:37: error: no matching function for call to 'Rcpp::class_<A_derived>::field(const char [5], double A<B_derived>::*)'<o:p></o:p></p>
<p class="MsoNormal">test2.cpp:33:37: note: candidate is:<o:p></o:p></p>
<p class="MsoNormal">C:/.../R/win-library/3.0/Rcpp/include/Rcpp/module/Module_Field.h:68:7: note: template<class T> Rcpp::class_<Class>::self& Rcpp::class_::field(const char*, T Class::*, const char*) [with T = T, Class = A_derived, Rcpp::class_<Class>::self
 = Rcpp::class_<A_derived>]<o:p></o:p></p>
<p class="MsoNormal">make: *** [test2.o] Error 1<o:p></o:p></p>
<p class="MsoNormal">Error in sourceCpp(file = "test2.cpp", verbose = TRUE) : <o:p>
</o:p></p>
<p class="MsoNormal">  Error 1 occurred building shared library.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Cheers,<o:p></o:p></p>
<p class="MsoNormal">Luke Domanski.<o:p></o:p></p>
</div>
</body>
</html>