命名空间“std”中的“function”未命名模板类型

问题描述 投票:0回答:2

使用 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++ r rcpp
2个回答
17
投票

为了能够在 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;};
}

0
投票

在您的 xplat/Flipper/FlipperTransportTypes.h 文件中

添加这个

#include <functional>

© www.soinside.com 2019 - 2024. All rights reserved.