如何为std :: pair<>创建接口swig&中没有默认构造函数蟒蛇?

时间:2017-03-30 09:10:58

标签: python c++ swig

我将使用swig制作python包装器。 我在c ++ dll中有一些类和类型。

class Image
{
public:
    Image(const Image&);
    Image& operator= (const Image&);
    ~Image();

    unsigned int width() const;
    unsigned int height() const;
};
struct Property
{
    std::string path;
    std::string datetime;
};
typedef std::pair<Image, Property> MyImage;
class Manage
{
public:
    Manage();
    ~Manage();
    void addMyImage(MyImage img);
    MyImage getMyImage(int index);
};

我在此之后创建了swig接口文件:

%include "std_pair.i"
%template(MyImage) std::pair<Image, Property>;
class Image
{
public:
    Image(const Image&);
    ~Image();

    unsigned int width() const;
    unsigned int height() const;
};
class Manage
{
public:
    Manage();
    ~Manage();

    void addMyImage(std::pair<Image, Property> img);
    std::pair<Image, Property> getMyImage(int index);
};

我运行命令swig -c++ -python Test.swig

我在Visual Studio中编译Test_wrapper.cxx,在此之后发生错误:

  

错误C2512:&#39;图片&#39; :没有合适的默认构造函数

所以我尝试了swig -c++ -python -nodefaultctor Test.swig。 但它是一样的。

============ UPDATE ============

问题是std::pair<Image, Property>。当pair创建时,它调用参数的构造函数。 Image没有默认构造函数。发生了这种情况。

我该如何解决? 感谢。

1 个答案:

答案 0 :(得分:2)

我终于想出了一种方法来完成这项工作。首先,既然你已经为addMyImagegetMyImage提供了按值传递的语义,你需要使用%feature("valuewrapper")在生成的代码中打开pass-by-value包装转换,否则你将在生成的代码中获得默认构造对。

其次,您需要阻止SWIG公开不带参数的std::pair构造函数。 (我认为这与%nodefaultctor指令不同,因为一个这样的构造函数是显式编写的,而不是简单地假设存在)。我花了很长时间才意识到最简单(?)方式的正确语法,我相信这是使用高级重命名。

因此,您需要在%include <std_pair.i>指令之前添加两行:

%feature("valuewrapper") std::pair<Image,Property>;
%rename("$ignore",$isconstructor,fullname=1) "std::pair<(Image,Property)>";
%include "std_pair.i"

但这会禁用std::pair<Image,Property>中的所有构造函数。