2

为什么在指定对象终结器时这个 Rcpp 模块暴露的 c++ 类不能编译?你能提供一个工作版本吗?

class Exposed{
     public:
        Exposed(){
          printf("constructor has been called\n");
        }

     private:
        int some_field;
}

来自 Rcpp Modules 教程:class_ 的 .finalizer 成员函数可用于注册终结器。终结器是一个自由函数,它接受一个指向目标类的指针并返回 void。终结器在析构函数之前调用,因此对目标类的有效对象进行操作。可用于执行操作、释放资源等……终结器在封装C++对象的R对象被垃圾回收时自动调用。

 static void finalizer_of_exposed( Exposed* ptr ){
      printf("finalizer has been called\n");
 }

 RCPP_MODULE(yada){

    class_<Exposed>("exposed")
        .constructor("")
        .finalizer( &finalizer_of_exposed )    
    ;
 }
4

1 回答 1

1

您是否尝试将其作为void没有 的功能static

2012 年 7 月 21 日编辑: 您发现了一个错误!Module.h 的第 720 行需要更改:

Index: inst/include/Rcpp/Module.h
===================================================================
--- inst/include/Rcpp/Module.h  (revision 3697)
+++ inst/include/Rcpp/Module.h  (working copy)
@@ -717,7 +717,7 @@
     private:

         void SetFinalizer( finalizer_class* f ){
-            if( class_pointer->finalizer_pointer ) delete class_pointer->finalizer ;
+            if( class_pointer->finalizer_pointer ) delete class_pointer->finalizer_pointer ;
             class_pointer->finalizer_pointer = f ; 
         }

我刚刚在 SVN 中修复了这个问题。谢谢!

于 2012-07-19T11:48:33.207 回答