Le 1 sept. 2014 à 11:48, Dr Gregory Jefferis <jeffe...@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


Hi, 

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. 

Romain


_______________________________________________
Rcpp-devel mailing list
Rcpp-devel@lists.r-forge.r-project.org
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel

Reply via email to