2016-01-21 40 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 

我看不出有任何理由为什么你的解决方案将是不可靠的。