如何在命名空间中将C ++类包含在Cython中?

时间:2016-01-21 15:21:03

标签: c++ cython

我试图为一组C ++类创建一个包,所以我可以使用Cython在Python中使用它。这是我到目前为止所尝试的。

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;

    };
}

1 个答案:

答案 0 :(得分:2)

你需要像你做的那样定义

cdef cppclass _HilClass "acro::HilClass"

因为你给 acro :: HilClass 一个别名 _HilClass 。您可以测试如果定义

会发生什么
cdef cppclass HilClass:
    void start()

然后(类名只是一个例子)

cdef class PyHilClass:
    cdef HilClass * ptr

我认为你的解决方案不可靠的原因没有任何理由。