'功能'在命名空间' std'没有命名模板类型

时间:2018-05-22 10:10:09

标签: c++ r rcpp

使用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);
  }

1 个答案:

答案 0 :(得分:6)

为了能够在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。引自Writing R extensions

  

为了在包中使用C ++ 11代码,包的Makevars文件   (或Windows上的Makevars.win)应包含行

     

CXX_STD = CXX11

     

然后将使用C ++ 11编译器进行编译和链接。

     

没有src / Makevars或src / Makefile文件的包可以指定   它们需要C ++ 11来代替src目录中的代码,包括'C ++ 11'   在DESCRIPTION文件的'SystemRequirements'字段中,例如

     

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;};
}