我将使用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没有默认构造函数。发生了这种情况。
我该如何解决? 感谢。
答案 0 :(得分:2)
我终于想出了一种方法来完成这项工作。首先,既然你已经为addMyImage
和getMyImage
提供了按值传递的语义,你需要使用%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>
中的所有构造函数。