Python错误:No constructor defined in SWIG generated module of C++ templated code

标签 python c++ templates swig

我正在尝试用 C++ 创建一个通用堆栈,然后尝试构建它的模块并使用 SWIG 将其扩展到 Python。
为此,templated_stack.h 中的代码如下

#include <string>
template <typename T>
class mNode {
public:
    T data;
    mNode* next;
    /* mNode() { } */
    mNode(T d) { 
        data = d;
        next = NULL;
    }

};
template <typename T>
class mStack {
    mNode<T> *topOfStack;
    mStack();   
    void push(T data);
    T pop();
};

template <class T> mStack<T>::mStack() {
    topOfStack = NULL;
}

template <class T> void mStack<T>::push(T data) {
    mNode<T>* newNode = new mNode<T>(data);
    newNode->next = topOfStack;
    topOfStack = newNode;
}

template <class T> T mStack<T>::pop(void) {
    mNode<T>* tempTop = topOfStack;
    T dataToBePopped = tempTop->data;
    topOfStack = topOfStack->next;
    delete tempTop;
    return dataToBePopped;
}

我写的接口(interface)文件是templated_stack.i如下

%module TemplatedStack
%{
        #include <string>
        #include "templated_stack.h"
%}

%include "templated_stack.h"

%template(IntStack) mStack <int>;

我正在通过以下脚本compileScript.sh来编译和构建模块,该脚本具有以下代码

swig -c++ -python -o templated_stack_wrap.cpp templated_stack.i
g++ -c -fPIC templated_stack_wrap.cpp -I/usr/include/python2.7
g++ -shared -o _TemplatedStack.so templated_stack_wrap.o

模块已成功构建,并且导入时没有任何错误,但是当我尝试如下创建 IntStack 对象时

from TemplatedStack import IntStack
t = IntStack()

我收到以下错误

in __init__(self, *args, **kwargs)
     75     __swig_getmethods__ = {}
     76     __getattr__ = lambda self, name: _swig_getattr(self, IntStack, name)
---> 77     def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
     78     __repr__ = _swig_repr
     79     __swig_destroy__ = _TemplatedStack.delete_IntStack

AttributeError: No constructor defined

有关上述错误的任何帮助将不胜感激
提前致谢 存储库的github链接是this

最佳答案

发生这种情况是因为 mStack 类的所有成员都是私有(private)的。 SWIG 无法包装私有(private)内容。

将关键字 class 更改为 struct,或者将 public: 添加到适当的定义中。

关于Python错误:No constructor defined in SWIG generated module of C++ templated code,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43993908/

相关文章:

python - 使用 win32COM 时创建新的 Python 对象

c++ - 内联模板函数?

c++ - 如何初始化具有类型特征的类模板的静态数据成员?

c++ - 需要帮助清理模板实例化框架

python - Django manager.py sql 创建空文件

python - 带模拟的 Django 单元测试

python - 如何在 Python 中使用海象运算符执行赋值解构

c++ - 两点之间的最近距离(不相交集)

c++ - 栈分配失败,堆分配成功!!可能吗?

c++ - 我可以在模板参数中声明一个 constexpr lambda 吗?