Boost.Python - ошибка с параметризованным конструктором - PullRequest
0 голосов
/ 04 апреля 2019

Я получил игрушечный класс от tutorialspoint в файле test.h:

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 ()?Если да, то как это сделать?

Ответы [ 2 ]

2 голосов
/ 04 апреля 2019

У вас нет конструктора по умолчанию, и вам не хватает того, который вы объявили:

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 );
}
1 голос
/ 04 апреля 2019

Компилятор жалуется, что Box не предоставляет конструктор по умолчанию BOOST_PYTHON_MODULE needs:

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

Просто определите одно:

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

Кроме того, вы можете проверить ответ Мохабудже.

...