在Rcpp中使用类时遭遇构造函数错误,寻求解决帮助
问题原因
你遇到的错误是因为代码中声明了不存在的无参构造函数:
- 你的
NormalDistribution类仅定义了接收double类型的mean和sd两个参数的构造函数,但在RCPP_MODULE里调用了.constructor(),这是在告诉Rcpp要暴露一个无参构造函数,而类中并没有实现它,因此编译器报错找不到匹配的无参构造函数。 - 另外,
DoSomething函数中直接以值传递方式接收NormalDistribution对象,这在Rcpp处理暴露类时容易引发拷贝问题,建议改用引用传递。
修复方案
根据你的需求选择以下一种方案:
方案1:添加无参构造函数
如果你需要支持无参创建对象,可以在类的public区域添加无参构造函数,给成员变量设置默认值:
class NormalDistribution { private: double mean; double sd; public: // 添加无参构造函数,默认均值0,标准差1 NormalDistribution() : mean(0.0), sd(1.0) {} NormalDistribution(double argMean, double argSd) : mean(argMean), sd(argSd) {} double AddMeanAndSd(){ return mean + sd; } };
同时保留RCPP_MODULE中的.constructor(),这样R中既可以无参创建对象,也可以传参创建。
方案2:仅暴露带参构造函数
如果不需要无参构造函数,就把RCPP_MODULE里的.constructor()替换为带参数的构造函数声明:
RCPP_MODULE(NormalDistribution_module) { class_<NormalDistribution>("NormalDistribution") // 声明接收两个double参数的构造函数 .constructor<double, double>() .method("AddMeanAndSd", &NormalDistribution::AddMeanAndSd) ; };
这样R中创建对象时必须传入两个数值参数,比如new(NormalDistribution)(0, 1)。
修正函数参数传递
无论选哪种方案,都建议修改DoSomething的参数为引用传递,避免不必要的对象拷贝:
// [[Rcpp::export]] arma::vec DoSomething(arma::vec x, const NormalDistribution& norm) { return x + norm.AddMeanAndSd(); }
内容的提问来源于stack exchange,提问作者Econ21
相关产品推荐
相关产品推荐

