【问题标题】:'function' in namespace 'std' does not name a template type命名空间“std”中的“function”没有命名模板类型
【发布时间】:2018-05-22 10:10:08
【问题描述】:

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

【问题讨论】:

  • 你加入了&lt;functional&gt; 吗?
  • 没有。我应该在哪里包含它?
  • 在您的 C++ 文件中,其余的 C++ 代码所在的位置使用 std::function

标签: c++ r rcpp


【解决方案1】:

为了能够在 C++ 中使用std::function,您必须通过包含正确的标题

#include <functional>

代码库中的某个位置。

至于 R 端,你必须告诉编译器你想使用 C++11 的特性。如果您只有一个通过Rcpp::sourceCpp 包含的.cpp 文件,则必须添加

// [[Rcpp::plugins(cpp11)]]

到您的.cpp 文件。

如果你正在编写一个 R 包(你引用的小插图就是为此),那么使用 Rcpp 不再强制使用 src/Makevars 文件,但建议在 src/Makevars 中使用 CXX_STD编写包时请求 C++11 的方式。或者,您可以在DESCRIPTION 中使用SystemRequirements。引用自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”字段中,例如

系统要求: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;};
}

【讨论】:

  • 好的,谢谢,那么我在哪里可以找到 Makevars 文件?我应该创建一个新的吗?在哪里?
  • 我没有构建包,我该怎么办?仅在我的 .cpp 文件中添加 #include 和 // [[Rcpp::plugins(cpp11)]]?
  • 我做了,但又出现了另一个错误:无法转换 'eqsir2(Rcpp::NumericVector)::{(* & theta) }' 从 'eqsir2(Rcpp::NumericVector)::' 到 'std::function, boost::array, 双)>'。我应该再问一个问题吗?
  • @AnthonyHauser 是的
  • 我用你的方法解决了我的问题,谢谢!
猜你喜欢
  • 2014-09-21
  • 1970-01-01
  • 2017-12-08
  • 2014-08-18
  • 1970-01-01
  • 1970-01-01
  • 2020-04-21
  • 2013-05-27
  • 2012-11-08
相关资源
最近更新 更多