为何pybind中无参构造函数使用py::kw_only会报错?
问题与解决:pybind11重载构造函数使用py::kw_only触发静态断言错误
问题描述
在C++中定义了包含默认构造函数和带参构造函数的重载构造函数,自动生成的pybind11绑定代码如下:
py::class_<MyClass>(m, "MyClass") .def( py::init<>(), py::kw_only() ) .def( py::init<std::valarray<std::string>>(), py::kw_only(), py::arg("my_var") )
保留无参构造函数时触发如下编译错误:
error: static assertion failed: py::kw_only requires the use of argument annotations static_assert(has_arg_annotations || !has_kw_only_args, "py::kw_only requires the use of argument annotations"
删除无参构造函数则编译正常,请问错误原因及解决方法?(使用自定义pybind生成器)
错误原因
py::kw_only()的作用是强制后续的函数/构造函数参数必须通过关键字参数传递,但无参构造函数没有任何参数可以绑定到关键字。pybind11的静态断言会检查:如果使用了py::kw_only(),则必须同时存在参数注解(即py::arg()这类标记),而无参构造函数无法提供任何参数注解,因此触发断言失败。
解决方法
方法1:移除无参构造函数的py::kw_only()
无参构造函数本身不需要任何参数,完全不需要强制关键字传递,直接去掉py::kw_only()即可:
py::class_<MyClass>(m, "MyClass") .def(py::init<>()) // 移除py::kw_only() .def( py::init<std::valarray<std::string>>(), py::kw_only(), py::arg("my_var") )
方法2:(可选)为无参构造函数添加空的参数注解
如果自定义生成器必须保留py::kw_only(),可以添加一个空的参数注解来满足断言条件,但这种做法没有实际业务意义,仅为了通过编译:
py::class_<MyClass>(m, "MyClass") .def( py::init<>(), py::kw_only(), py::arg() // 空参数注解,仅满足断言要求 ) .def( py::init<std::valarray<std::string>>(), py::kw_only(), py::arg("my_var") )
内容的提问来源于stack exchange,提问作者thzu
相关产品推荐
相关产品推荐

