<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;}
@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">I running into some problems using a combination of Rcpp-attributes and Rcpp-modules to expose a C++ class library, and would appreciate your help.<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">I am trying to expose to R the constructor of a C++ class template which accepts a std vector of the template parameter T as input, as shown in the following toy class A used to replicate the problem:<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">template <class T> class A {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    public:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">        std::vector<T> vec_of_T;<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">        A( std::vector<T> in_vec );<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"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">The class and constructor will only be exposed to R as a specific instantiation of the class A with template parameter T=class B, i.e. A<B>, where B is implemented in both C++ and R, and the C++ implementation of B has
 a constructor B::B(SEXP):<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">#include <RcppCommon.h><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">class B {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    public:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">        int id;<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">        B (SEXP b);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">        B (int id=-1);<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"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">/*** R<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"># Reference Class of B<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">B_R <- setRefClass( "B_R",<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    fields = list(id="numeric")<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">*/<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">template <class T> class A {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    public:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">        std::vector<T> vec_of_T;<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">        A( std::vector<T> in_vec );<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"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#include <Rcpp.h><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">B::B(SEXP b){<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    Rcpp::Reference in_b(b);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    id=in_b.field("id");<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"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">B::B(int id){<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    this->id=id;<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"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">The idea is to allow an R vector of Reference Class objects B_R to be passed to the C++ class A<B> constructor. To achieve this I have used the following Rcpp-modules directly after the preceding code:<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">using namespace Rcpp;<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">RCPP_MODULE(testing) {<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">    class_< A<B> >("A")<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">    .constructor< std::vector<B> >()<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">}<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">I then use Rcpp-attributed sourceCpp() to compile the code from the R prompt, and generate the R bindings to the C++ class A<B>.<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">> sourceCpp(file="test.cpp", verbose=TRUE)<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">From my understand of  section 3.2 in Rcpp-introduction.pdf, and what I could glean about the handling of RCPP_MODULE declarations within Rcpp-attribute (e.g. help(sourceCpp)), the conversion of “STL vectors of […] arbitrary
 types that offer a constructor that takes a SEXP” should be supported by Rcpp, and Rcpp-attributes should automatically generate wrappers/bindings which utilize them.<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">However, when I run the above sourceCpp command I get the following error which is stretching my understanding on both C++ and Rcpp:
<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"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">C:/PROGRA~1/R/R-30~1.1/bin/i386/R CMD SHLIB -o "sourceCpp_42052.dll" "test.cpp"
<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">g++ -m32 -I"C:/PROGRA~1/R/R-30~1.1/include" -DNDEBUG     -I"C:/Users/me/Documents/R/win-library/3.0/Rcpp/include"  -I"d:/RCompile/CRANpkg/extralibs64/local/include"     -O2 -Wall  -mtune=core2 -c test.cpp -o test.o<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">In file included from C:/Users/me/Documents/R/win-library/3.0/Rcpp/include/RcppCommon.h:110:0,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                 from test.cpp:1:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">C:/Users/me/Documents/R/win-library/3.0/Rcpp/include/Rcpp/internal/export.h: In function 'void Rcpp::internal::export_range(SEXP, InputIterator) [with InputIterator = __gnu_cxx::__normal_iterator<B*, std::vector<B> >,
 SEXP = SEXPREC*]':<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">C:/Users/me/Documents/R/win-library/3.0/Rcpp/include/Rcpp/internal/Exporter.h:47:17:   instantiated from 'T Rcpp::traits::RangeExporter<T>::get() [with T = std::vector<B>]'<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">C:/Users/me/Documents/R/win-library/3.0/Rcpp/include/Rcpp/as.h:83:33:   instantiated from 'T Rcpp::internal::as(SEXP, Rcpp::traits::r_type_generic_tag) [with T = std::vector<B>, SEXP = SEXPREC*]'<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">C:/Users/me/Documents/R/win-library/3.0/Rcpp/include/Rcpp/as.h:126:89:   instantiated from 'T Rcpp::as(SEXP) [with T = std::vector<B>, SEXP = SEXPREC*]'<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">C:/Users/me/Documents/R/win-library/3.0/Rcpp/include/Rcpp/module/Module_generated_Constructor.h:47:43:   instantiated from 'Class* Rcpp::Constructor_1<Class, U0>::get_new(SEXPREC**, int) [with Class = A<B>, U0 = std::vector<B>,
 SEXP = SEXPREC*]'<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">test.cpp:59:1:   instantiated from here<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">C:/Users/me/Documents/R/win-library/3.0/Rcpp/include/Rcpp/internal/export.h:90:4: error: no matching function for call to 'export_range__dispatch(SEXPREC*&, __gnu_cxx::__normal_iterator<B*, std::vector<B> >&, Rcpp::traits::r_type_traits<B>::r_category)'<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">C:/Users/me/Documents/R/win-library/3.0/Rcpp/include/Rcpp/internal/export.h:90:4: note: candidates are:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">C:/Users/me/Documents/R/win-library/3.0/Rcpp/include/Rcpp/internal/export.h:71:14: note: template<class InputIterator, class value_type> void Rcpp::internal::export_range__dispatch(SEXP, InputIterator, Rcpp::traits::r_type_primitive_tag)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">C:/Users/me/Documents/R/win-library/3.0/Rcpp/include/Rcpp/internal/export.h:80:8: note: template<class InputIterator, class value_type> void Rcpp::internal::export_range__dispatch(SEXP, InputIterator, Rcpp::traits::r_type_string_tag)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">make: *** [test.o] Error 1<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Error in sourceCpp(file = "test.cpp", verbose = TRUE) :
<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">  Error 1 occurred building shared library.<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">Am I missing something in my code?<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 in advance,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Luke Domanski.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
</div>
</body>
</html>