使用Rcpp软件包在R中包含C ++,我尝试编译C ++文件。这是出现的错误:
名称空间“ std”中的“功能”未命名模板类型
经过调查,我被告知我的代码使用的某些功能只能从C ++ 11获得。因此,我需要在Makevars文件中添加一行。但是,我发现一个小插图说Makevars不再是必需的:Rcpp vignette。我该如何解决这个问题?
这是C ++脚本无效的部分:
std::function<void(const state_type, state_type, const double)> eqsir2(const Rcpp::NumericVector theta) {
return [&theta](const state_type &x, state_type &dxdt, const double t) {
boost_array_to_nvec2(x, nvec);
my_fun22(nvec,t,theta);
nvec_to_boost_array2(nvec, dxdt);
}
为了能够std::function
在C ++中使用,您必须通过添加正确的标头
#include <functional>
在代码库中的某个位置。
至于R端,您必须告诉编译器您想使用C ++ 11功能。如果您只有通过包含的.cpp
文件,Rcpp::sourceCpp
则必须添加
// [[Rcpp::plugins(cpp11)]]
到您的.cpp
文件。
如果你正在写A R包(你所引用的小插曲是用于那些),那么src/Makevars
文件不再强制要求使用Rcpp
,但使用CXX_STD
中src/Makevars
是请求C ++ 11 wrting包时所建议的方式。或者,您可以SystemRequirements
在中使用DESCRIPTION
。以编写R扩展为例:
为了在包中使用C ++ 11代码,包的Makevars文件(或Windows上的Makevars.win)应包含以下行:
CXX_STD = CXX11
然后将使用C ++ 11编译器进行编译和链接。
没有src / Makevars或src / Makefile文件的软件包可以通过在Description文件的“ SystemRequirements”字段中包含“ C ++ 11”来指定它们要求src目录中的C ++ 11代码。
系统要求:C ++ 11
如果软件包确实具有src / Makevars [.win]文件,则最好设置make变量'CXX_STD',因为它允许R CMD SHLIB在软件包的src目录中正常工作。
另外,您必须确保返回的函数和lambda的签名相同(请参见例如此处)。就目前而言,您仅对其中之一使用引用。两者都有可能,您只需要保持一致即可:
#include <Rcpp.h>
// [[Rcpp::plugins(cpp11)]]
#include <functional>
// [[Rcpp::depends(BH)]]
#include <boost/array.hpp>
typedef boost::array<double, 3> state_type;
// references
std::function<void(const state_type&, state_type&, const double)> eqsir2(const Rcpp::NumericVector theta) {
return [&theta](const state_type &x, state_type &dxdt, const double t) {return;};
}
// no references
std::function<void(const state_type, state_type, const double)> eqsir(const Rcpp::NumericVector theta) {
return [&theta](const state_type x, state_type dxdt, const double t) {return;};
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句