使用 Rcpp 包在 R 中包含 C++,我尝试编译我的 C++ 文件。这是出现的错误:
命名空间“std”中的“function”未命名模板类型
经过调查,我被告知我的代码使用了一些只能在 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);
}
为了能够在 C++ 中使用
std::function
,您必须通过 包含正确的标头
#include <functional>
代码库中的某个位置。
对于R端,你必须告诉编译器你想使用C++11特性。如果您只有一个通过
.cpp
包含的 Rcpp::sourceCpp
文件,则必须添加
// [[Rcpp::plugins(cpp11)]]
到您的
.cpp
文件。
如果您正在编写 R 包(您引用的小插图就是为了这个目的),那么使用
src/Makevars
时不再强制使用 Rcpp
文件,但在 CXX_STD
中使用 src/Makevars
是建议的方法编写包时请求 C++11。或者,您可以在 SystemRequirements
中使用 DESCRIPTION
。引用自编写 R 扩展:
为了在包中使用 C++11 代码,包的 Makevars 文件 (或 Windows 上的 Makevars.win)应包含该行
CXX_STD = CXX11
然后将使用 C++11 编译器完成编译和链接。
没有 src/Makevars 或 src/Makefile 文件的包可能会指定 他们通过包含“C++11”来要求 src 目录中的代码使用 C++11 在描述文件的“SystemRequirements”字段中,例如
系统要求:C++11
如果包确实有 src/Makevars[.win] 文件,则设置 make 变量“CXX_STD”是首选,因为它允许 R CMD SHLIB 工作 正确位于包的 src 目录中。
此外,您必须确保返回函数的签名和 lambda 相同(参见例如here)。就目前情况而言,您仅使用其中之一的参考。两者都是可能的,你只需保持一致:
#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;};
}
在您的 xplat/Flipper/FlipperTransportTypes.h 文件中
添加这个
#include <functional>