C++ R包错误:上传库

Ste*_*ore -2 r package armadillo rcpp

我将我的包提交到CRAN存储库.该包被接受没有错误,但在检查CRAN维护者的第二步报告了以下错误.

不幸的是,我不明白我是如何解决它的.

In file included from /Builds/CRAN-QA-Simon/packages/mavericks-x86_64/Rlib/3.3/RcppArmadillo/include/armadillo:23:

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/fstream:864:20: error: 
no member named 'Rf_error' in 'std::__1::codecvt_base'; did you mean simply 'Rf_error'?
    if (__r == codecvt_base::error)
               ^~~~~~~~~~~~~~

/Library/Frameworks/R.framework/Resources/include/R_ext/Error.h:35:12: note:
'Rf_error' declared here
void NORET Rf_error(const char *, ...);
           ^
Run Code Online (Sandbox Code Playgroud)

在我的C++文件中,我写道:

#include <math.h>      
#include "ANN/ANN.h"     
#include "NN.h"  
#include <R.h>   
#include "RcppArmadillo.h" 

#include <map>
#include <vector>
#include <iostream>
Run Code Online (Sandbox Code Playgroud)

我该怎么纠正这个?是否包含Rpp.h?

Dir*_*tel 8

R本身是用C语言编写的,因为它早在20世纪90年代初就开始了.C没有名称空间 - 由于缺少名称空间分隔,这可能导致冲突.来自共享相同名称的不同库的标识符可能是错误的.这发生在这里.

R在其C API中使用函数length(),error()......等,考虑到名称的常见性,它们可能会发生冲突.因此R具有作为Rf_其符号前置的机制:error变为Rf_error.这使用预处理器,这是相当愚蠢的(与使用编译器本身相反).因此当R看到error它想要它时Rf_error.

这里发生的事情是你很可能已经#include <RcppArmadillo.h>(因此隐含#include <Rcpp.h> 你的实际库的包含之前.反过来尝试它.这样R的混乱它error()不会干扰你在这里让你感到困惑的库.