2016-01-21 69 views
2

我想創建一個設置C++類的包裝,所以我可以在Python中使用它使用Cython。這是我到目前爲止所嘗試的。如何在命名空間中將C++類包含到Cython中?

cdef extern from "HilClass.h" namespace "acro": 
    cdef cppclass _HilClass "HilClass": 
     void start() 

cdef class HilClass: 
    cdef _HilClass *ptr 

    cpdef start(self): 
     self.ptr.start() 

那不能編譯。我得到了下面的錯誤,現在我已經瞭解到一個可能的原因是它沒有找到類。所以在檢查後我已經正確地包含了頭文件和源代碼,我查看了由Cython生成的.cpp文件。我搜索了acro,但無法找到它。代碼中沒有提及任何地方。

error C2143: syntax error: missing ';' before '*' 
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
error C2238: unexpected token(s) preceding ';' 
... (more warning and errors related to HilClass) 

這是當我決定改變第二行。

cdef cppclass _HilClass "acro::HilClass": 

這確實編譯。但是這並沒有在我找到的任何示例/教程中完成。所以我的問題是,我錯過了一些東西,並且我的'解決方法'能夠可靠地工作。

注意:我不想在Python或Cython中創建此類的實例,我只是需要它來環繞HilClass指針。

編輯: 這是'HilClass.h'內的代碼。 'acrophobe.h'有幾個類的前向聲明,枚舉,typedef unint#_t ####,幷包含stdint。

#include "acrophobe.h" 

namespace acro { 
    class HilClass 
    { 
    public: 
     HilClass(AcrophobeClass *acro_ptr); 
     ~HilClass(); 

     HILSocketClass *sck; 

     void start(); 
     void acrophile_iteration(char dest, lbp::PortID_t PortID); 

     void set_activity_iteration_start(bool s); 
     // More of these set_activity functions 
     void set_activity_logging(bool s); 


    private: 
     AcrophobeClass *acro; 

    }; 
} 
+0

您的問題可能與* HilClass.h *中的代碼有關,因此無法弄清楚問題所在。您可能需要在* HilClass.h *之前包含一些其他頭文件來解決該問題。 –

+0

我相信你的workround是可靠的。我不確定你原來的問題是由什麼引起的。 – DavidW

回答

1

您需要定義爲你做

cdef cppclass _HilClass "acro::HilClass" 

,因爲你給ACRO :: HilClass別名_HilClass。您可以測試,如果你定義

cdef cppclass HilClass: 
    void start() 

再後來發生了什麼(類名僅僅是一個例子)

cdef class PyHilClass: 
    cdef HilClass * ptr 

我看不出有任何理由爲什麼你的解決方案將是不可靠的。