我遵循这里的文档:http://www.swig.org/Doc3.0/Library.html#Library_stl_cpp_library编写一个包含向量的简单示例代码的包装器。在
以下是头文件:
### word.h ###
#include<string>
#include<vector>
class Word{
public:
Word(std::string word, int numWords, std::vector<double> &values);
~Word();
void updateWord(std::string newWord);
std::string getWord();
void processValues();
private:
std::string theWord;
int totalWords;
std::vector<double> values;
};
以及源文件:
^{pr2}$以下是接口文件:
### word.i ###
%module word
%{
#include "word.h"
%}
%include "std_string.i"
%include "std_vector.i"
namespace std {
%template(vectord) vector<double>;
}
%include "word.h"
我的编译步骤如下:
swig -c++ -python word.i
g++ -c -fpic word.cpp word_wrap.cxx -I/usr/include/python2.7
g++ -shared word.o word_wrap.o -o _word.so -lstdc++
编译过程中没有任何错误。但是,在尝试用Python创建对象时,我得到了以下错误:
In [1]: import word
In [2]: w = word.Word('test', 10, [10.2])
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-2-ee2e5c406fd9> in <module>()
----> 1 w = word.Word('test', 10, [10.2])
/home/anarayan/workspace/swig-learn/word.pyc in __init__(self, word, numWords, values)
276
277 def __init__(self, word, numWords, values):
--> 278 this = _word.new_Word(word, numWords, values)
279 try:
280 self.this.append(this)
TypeError: in method 'new_Word', argument 3 of type 'std::vector< double,std::allocator< double > > &'
在网上搜索一下,我相信在SWIG定义中使用模板可以解决这个问题。在
但是,就我的情况来说没有。你能给我指一下正确的方向吗?在
它不起作用,因为你通过引用传递向量。如果改为按值传递或按常量引用传递,SWIG知道该怎么做并生成正确的代码。只是在声明和定义中更改类型
足够了。在
^{pr2}$在这种情况下,您可以应用上述调整,因为您不需要
values
作为一个裸引用。如果需要引用,则需要更多的工作,并且您必须编写自己的类型映射(可能还有您自己的容器)。在相关问题 更多 >
编程相关推荐