2017-05-16 8 views
1

C++에서 제네릭 스택을 만든 다음 모듈을 빌드하고 SWIG를 사용하여 파이썬으로 확장하려고합니다. 이를 위해
은 templated_stack.h의 코드는 다음과 같다Python 오류 : SWIG에 정의 된 생성자가 C++ 템플릿 코드의 모듈을 생성하지 않았습니다.

#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; 
} 

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

%include "templated_stack.h" 

%template(IntStack) mStack <int>; 

을 다음과 내가 따라 컴파일 및 건물 모듈있어 나는 작성한 인터페이스 파일은 templated_stack.i입니다 다음과 같은 코드를 가진 script compileScript.sh

모듈이 성공적으로 빌드되었고 아무런 오류없이 가져오고 있습니다. 내가 오류

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 

다음 얻고있다

from TemplatedStack import IntStack 
t = IntStack() 

을 다음과 같이 IntStack의 객체를 만들려고하지만 어떤 도움 사전 의 GitHub의 링크에서 위의 오류를
감사에 대한 감사하겠습니다 저장소가 this

답변

1

mStack 클래스의 모든 구성원이 비공개이므로이 문제가 발생합니다. SWIG는 사적인 것을 포장 할 수 없습니다.

classstruct으로 변경하거나 public:을 적절하게 추가하십시오.