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