Boost.Python - 参数化构造函数出错

Posted

技术标签:

【中文标题】Boost.Python - 参数化构造函数出错【英文标题】:Boost.Python - error with parametrized constructor 【发布时间】:2019-04-04 08:47:38 【问题描述】:

我在文件 test.h 中有一个来自 tutorialspoint 的玩具类:

class Box 
   public:

      Box(int l, int b, int h)
      
        length = l;
        breadth = b;
        height = h;       
      

      double getVolume(void) 
         return length * breadth * height;
      
      void setLength( double len ) 
         length = len;
      
      void setBreadth( double bre ) 
         breadth = bre;
      
      void setHeight( double hei ) 
         height = hei;
      

   private:
      double length;      // Length of a box
      double breadth;     // Breadth of a box
      double height;      // Height of a box
;

在我的另一个文件中:

BOOST_PYTHON_MODULE(test)

  namespace python = boost::python;

  python::class_<Box>("Box")
    .def("setLength",  &Box::setLength )
    .def("setBreadth", &Box::setBreadth)
    .def("setHeight",  &Box::setHeight )
    .def("getVolume",  &Box::getVolume );

当我编译这段代码时,我收到有关 Box 类构造函数的错误消息:

/usr/include/boost/python/object/value_holder.hpp:133:13: error: no matching function for call to ‘Box::Box()’
             BOOST_PP_REPEAT_1ST(N, BOOST_PYTHON_UNFORWARD_LOCAL, nil)
             ^

我错过了什么?

我需要在 BOOST_PYTHON_MODULE() 中编写构造函数参数吗?如果有,该怎么做?

【问题讨论】:

【参考方案1】:

您没有默认构造函数,并且缺少您声明的构造函数:

BOOST_PYTHON_MODULE(test) 
  namespace python = boost::python;

  python::class_<Box>("Box", boost::python::init<int, int, int>())
    .def("setLength",  &Box::setLength )
    .def("setBreadth", &Box::setBreadth)
    .def("setHeight",  &Box::setHeight )
    .def("getVolume",  &Box::getVolume );

【讨论】:

我也不懂@YSC,这解决了问题。 其实答案,比@YSC 的建议更好(因为它改变了对象的合同,对不起!)。 错误:'init' 不是 'boost' 的成员 python::class_("Box", boost::init()) 对不起,init 函数是在 boost::python 命名空间中定义的。我刚刚更新了答案。 @PintoDoido【参考方案2】:

编译器抱怨Box 没有提供默认构造函数BOOST_PYTHON_MODULE 需要:

no matching function for call to ‘Box::Box()

简单定义一个:

class Box 
public:
    Box() = default;
// [...]
;

另外,您可以查看 mohabouje 的答案。

【讨论】:

以上是关于Boost.Python - 参数化构造函数出错的主要内容,如果未能解决你的问题,请参考以下文章

Boost.Python:在类外定义构造函数

有没有一种用构造函数参数实例化类的捷径? [复制]

Boost Python 暴露 C++ 类,构造函数采用 std::list

将 boost::python::numpy::ndarray 作为 boost::python 函数的(默认与否)参数传递?

org.springframework.beans.factory.BeanCreationException:创建名为“”的bean时出错:通过构造函数进行bean实例化失败;

使用boost python编译在python代码内部调用的c ++代码时出错