SWIG C ++到python:矢量问题

时间:2018-07-22 14:40:28

标签: python c++ swig

我正在关注这里的文档:http://www.swig.org/Doc3.0/Library.html#Library_stl_cpp_library,以将包装器写入涉及矢量的简单示例代码。

这是头文件:

.col-md-3

和源文件:

.single__content {
    width: 100%;
    max-width: 743px;
    padding-top: 57px;
}
.single__content p {
    color: #707070;
    font-size: 15px;
    font-weight: 400;
    line-height: 23px;
}
.single__meta {
    background: #3c73ba;
    height: 70px;
}
.single__meta h2 {
    font-size: 38px;
    font-weight: 300;
    line-height: 42px;
    color: #fff;
    margin: 0;
    padding-top: 14px;
}
.col-sidebar {
    background: #4285db;
}

这是接口文件:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href="vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet" />

<div class="single__meta">
    <div class="container">
        <div class="row ">
          <div class="col-md-9">
              <h2 class="page-title">Lorem ipsum dolor</h2>
          </div>
          <div class="col-sidebar col-md-3">
              Second column content
          </div>
        </div>
    </div>
</div>

我的编译步骤如下:

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

编译顺利进行,没有任何错误。但是,尝试在Python中创建对象时,出现以下错误:

### word.cpp ###
#include "word.h"
#include <cfloat>
#include <cmath>
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <time.h>

Word::Word(std::string word, int numWords, std::vector<double> &values) :
    theWord(word), totalWords(numWords), values(values){
    // TODO: constructor
}

Word::~Word() {
    // TODO: destructor
}

void Word::updateWord(std::string newWord) {
    this->theWord = newWord;
}

std::string Word::getWord() {
    return this->theWord;
}

void Word::processValues() {
    values.resize(totalWords);
    // do something with values here
}

/*  
    rest of the code that uses the other imports
*/

一些在线搜索使我相信,在SWIG定义中使用模板可以解决此问题。

但是,就我而言,事实并非如此。你能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

它不起作用,因为您通过引用传递了向量。如果改为通过值或const引用传递,SWIG知道该怎么做并生成正确的代码。只需在声明和定义中更改类型

Word(std::string word, int numWords, std::vector<double> const &values);

足够了。

$ 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
Python 2.7.13 (default, Nov 24 2017, 17:33:09) 
[GCC 6.3.0 20170516] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import word
>>> w = word.Word('test', 10, [10.2])

在这种情况下,您可以应用上述调整,因为您不需要values作为参考。如果需要引用,则需要做更多的工作,并且您必须编写自己的类型图(可能还需要自己的容器)。