带有 Rcpp 的包忽略#include <stack>

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

我想在 R 包内的 C++ 函数中使用

std::stack
。考虑以下示例 C++ 文件:

// [[Rcpp::plugins(cpp20)]]
#include <Rcpp.h>
#include <stack>

// [[Rcpp::export]]
Rcpp::XPtr<std::stack<int> > stack_c(Rcpp::IntegerVector& v) {
  std::stack<int>* s = new std::stack<int>;
  s->push(v[0]);
  Rcpp::XPtr<std::stack<int> > p(s);
  return p;
}

使用

Rcpp::sourceCpp()
在 R 包之外编译它是可行的。但是,它在 R 包中不起作用。

R 包包含上述 C++ 文件和一个 Makevars 文件,其 src 目录中包含

CXX_STD = CXX20
行。

R目录下的R文件调用该函数。

#' @export
stack_r <- function(x) {
  return(stack_c(x))
}

NAMESPACE 文件包含常用的 Rcpp 行。

useDynLib(testpkg, .registration=TRUE)
importFrom(Rcpp, evalCpp)
exportPattern("^[[:alpha:]]+")

描述文件导入并链接到 Rcpp。

Imports: Rcpp (>= 1.0.13)
LinkingTo: Rcpp

尝试安装该软件包时,出现以下编译器错误:

RcppExports.cpp:14:18: error: 'stack' is not a member of 'std'
   14 | Rcpp::XPtr< std::stack<int> > create_stack(Rcpp::IntegerVector& v);
      |                  ^~~~~
RcppExports.cpp:5:1: note: 'std::stack' is defined in header '<stack>'; did you forget to '#include <stack>'?

我不知道为什么会出现这种情况。 C++ 文件清楚地包含行

#include <stack>
.

我需要设置其他编译器标志吗?

我使用带有最新 Rtools、R 和 Rcpp 版本的 Windows 11。

c++ r stl rcpp r-package
1个回答
0
投票

您编写的 C++ 文件具有正确的标头。 但是由

Rcpp
生成的C++文件,即
RcppExports.cpp
,还不知道附加头。 要提供该信息,您可以使用具有特殊名称的文件,如“生成代码中的类型”部分的相应小插图中详细描述的。一种解决方案是 inst/include/testpkg_types.h,因为您的包裹称为
testpkg
一个更简单的快捷方式是不在返回类型中使用 

std::stack

而是简单地使用

SEXP
    

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