Python 错误:在 SWIG 生成的 C++ 模板代码模块中未定义构造函数

Posted

技术标签:

【中文标题】Python 错误:在 SWIG 生成的 C++ 模板代码模块中未定义构造函数【英文标题】:Python Error:No constructor defined in SWIG generated module of C++ templated code 【发布时间】:2017-05-16 06:26:07 【问题描述】:

我正在尝试在 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;

我写的接口文件是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

【问题讨论】:

【参考方案1】:

这是因为mStack 类的所有成员都是私有的。 SWIG 不能包装私人的东西。

要么将关键字class 更改为struct,要么将public: 适当地添加到定义中。

【讨论】:

以上是关于Python 错误:在 SWIG 生成的 C++ 模板代码模块中未定义构造函数的主要内容,如果未能解决你的问题,请参考以下文章

无法为 c++ python 扩展编译 swig 生成的包装器

无法使用 SWIG 在 Python 中实例化 C++ 类(获取属性错误)

使用从 SWIG 生成的 python 文件时出错(从 C++ 生成)

如何使用swig为c++生成php接口so

如何从 SWIG 中获取正确的错误,并在 Python 中不正确地重载 C++ 虚函数

SWIG - python 中的 C++ 代码