Rcpp中使用模板函数提示'T' was not declared in this scope错误如何解决?
问题原因解答
这个报错确实是模板使用方式不符合Rcpp的导出规则导致的。
Rcpp的
// [[Rcpp::export]]导出宏不支持直接导出泛型模板函数:C++模板属于编译期多态,只有在调用时指定了模板参数的具体类型才会生成对应的可执行代码;而Rcpp生成R侧绑定代码时,需要明确知道函数所有参数、返回值的具体类型,直接给未实例化的模板函数加导出标记,生成绑定代码时自然找不到未确定的模板类型T的定义,触发该报错。
可行解决方法
下面提供两种常用的落地方案:
方案1:写具体类型的包装函数(新手最友好,适合用到的类型不多的场景)
删除模板函数上的导出标记,只给你实际需要用到的具体类型的包装函数加导出即可,示例修改后代码如下:
#include <Rcpp.h> #include <vector> #include <algorithm> using namespace Rcpp; // 模板函数不要加导出标记 template < typename T> std::pair<bool, int> findInVector(const std::vector<T> & vecOfElements, const T & element) { std::pair<bool, int > result; auto it = std::find(vecOfElements.begin(), vecOfElements.end(), element); if (it != vecOfElements.end()) { result.second = std::distance(vecOfElements.begin(), it); result.first = true; } else { result.first = false; result.second = -1; } return result; } // 导出字符串类型的版本 //[[Rcpp::export]] std::pair<bool, int> findInVector_str(const std::vector<std::string> & vecOfElements, const std::string & element) { return findInVector(vecOfElements, element); } // 如果需要用到整数版本,再加一个即可 //[[Rcpp::export]] std::pair<bool, int> findInVector_int(const std::vector<int> & vecOfElements, const int & element) { return findInVector(vecOfElements, element); } /*** R findInVector_str(c('A', 'b', 'g'), 'g') */
方案2:类型动态分发(适合需要支持多类型、不想写多个函数名的场景)
用SEXP作为参数类型,内部判断输入数据的类型再分发到对应模板实例,对外只暴露一个导出函数,R侧调用不需要区分类型。
额外提示
- R的下标默认从1开始,上面返回的下标是C++侧的0开始下标,如果需要和R习惯对齐,可以把返回的
result.second加1。 - 如果需要处理缺失值,需要额外加对应类型的NA判断逻辑。
内容的提问来源于stack exchange,提问作者Hamed B
相关产品推荐
相关产品推荐

