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++ 生成)