[Rcpp-devel] RcppModules with templated class

Romain Francois romain at r-enthusiasts.com
Mon Sep 1 18:32:00 CEST 2014

Le 1 sept. 2014 à 11:48, Dr Gregory Jefferis <jefferis at mrc-lmb.cam.ac.uk> a écrit :

> Hello,
> I have a more or less complete Rcpp(Eigen) dependent package that exposes a pair of C++ classes to R using RcppModules;the C++ classes (which implement k nearest neighbour search trees) differ only in their scalar storage type (float vs double) and are called WKNND and WKNNF. For future flexibility/maintenance I would have like to convert the C++ classes to templated code. Is it possible to use RcppModules to expose template classes? I know that Rcpp in general can be used with template classes, but the RcppModules manual does not seem to mention this.
> I have tried to implement this by simple translation of my existing code to a single WKNN class and then defining types for  WKNND and WKNNF (i.e. double and float). However this falls over with errors/notes indicating that the automatic wrap/conversion of Eigen types is failing to pick up the typedef. Error:
> In file included from WKNND.cpp:1:
> In file included from /Library/Frameworks/R.framework/Versions/3.1/Resources/library/Rcpp/include/Rcpp.h:27:
> In file included from /Library/Frameworks/R.framework/Versions/3.1/Resources/library/Rcpp/include/RcppCommon.h:169:
> In file included from /Library/Frameworks/R.framework/Versions/3.1/Resources/library/Rcpp/include/Rcpp/as.h:25:
> /Library/Frameworks/R.framework/Versions/3.1/Resources/library/Rcpp/include/Rcpp/internal/Exporter.h:31:28: error: no matching constructor for initialization of 'WKNN<double>'
>                    Exporter( SEXP x ) : t(x){}
>                                         ^ ~
> and notes like:
> ./WKNN.h:14:8: note: candidate constructor (the implicit copy constructor) not viable: cannot convert argument of incomplete type 'SEXP' (aka 'SEXPREC *') to 'const WKNN<double>'
> struct WKNN {
>       ^
> ./WKNN.h:16:3: note: candidate constructor not viable: cannot convert argument of incomplete type 'SEXP' (aka 'SEXPREC *') to 'const Eigen::Map<Eigen::Matrix<double, Dynamic, Dynamic> >'
>  WKNN(const Eigen::Map<Eigen::Matrix<T, Dynamic, Dynamic> > data, bool buildtree=true);
>  ^
> So is there a way round this? Do I have to write an explicit wrap function? Do I have to give up on using RcppModules altogether? Any advice or pointers to a package already doing this would be much appreciated. And of course big thanks to Dirk, Romain and Douglas et al for these great packages.
> Best wishes,
> Greg.
> PS Code on this branch:
> https://github.com/jefferis/nabor/tree/feature/template-WKNN
> with these 2 commits making the changes:
> https://github.com/jefferis/nabor/commit/fa85ddae5187f1e93801d7ec36d1d78923384cc6
> https://github.com/jefferis/nabor/commit/9ff93e63023b2f6d9c7ddad54fb7d1f503685b86


This looks related to what RCPP_EXPOSED_CLASS does, perhaps because your class comes from a template, you could try RCPP_EXPOSED_CLASS_NODECL instead. The only difference is that it does not add the class forward declaration, so you'd have to have it after you have defined or declared your class. 


More information about the Rcpp-devel mailing list