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

Aar*_*ndt 5 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()
Run Code Online (Sandbox Code Playgroud)

那不编译。我收到以下错误,现在我已经了解到一个可能的原因是它没有找到类。因此,在检查我已正确包含标题和来源后,我查看了 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)
Run Code Online (Sandbox Code Playgroud)

这是我决定将第二行更改为。

    cdef cppclass _HilClass "acro::HilClass":
Run Code Online (Sandbox Code Playgroud)

这确实编译。但这在我发现的任何示例/教程中都没有完成。所以我的问题是,我错过了一些东西,我的“解决方法”能否继续可靠地工作。

注意:我对从 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;

    };
}
Run Code Online (Sandbox Code Playgroud)

J.J*_*ala 5

你需要像你所做的那样定义

cdef cppclass _HilClass "acro::HilClass"
Run Code Online (Sandbox Code Playgroud)

因为你给acro::HilClass一个别名_HilClass。如果你定义,你可以测试会发生什么

cdef cppclass HilClass:
    void start()
Run Code Online (Sandbox Code Playgroud)

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

cdef class PyHilClass:
    cdef HilClass * ptr
Run Code Online (Sandbox Code Playgroud)

我看不出您的解决方案不可靠的任何理由。