Boost.Ошибки сборки библиотеки Python при отсутствии конструктора по умолчанию и уникального указателя

#python #c #boost #boost-python

#python #c #boost #boost-python

Вопрос:

Я пытаюсь обернуть свой код C с помощью Boost.Python и столкнулись с парой ошибок и могли бы воспользоваться некоторой помощью в их решении. Но сначала вот ресурсы, которые у меня есть.

Product.h

 namespace Products
{
  class Product
  {
  public:
    virtual ~Product() {};
    virtual int generateProduct(int verbose = 0) = 0;
    virtual int getQueueNum() = 0;
    virtual std::vector<std::vector<std::string> > getQueue(const int amp;index_int) = 0;
  };
}
 

ProductBuilder.h

 namespace Products
{
  class ProductBuilder
  {
  public:
    ProductBuilder(const std::map<std::string,std::string> input_map, const std::deque<std::string> amp;dates_deque);
    int build(int verbose = 0);
    int numQueue() {return m_product->getQueueNum();};
    std::vector<std::vector<std::string> > getQueueByIndex(const int amp;index_int) {return m_product->getQueue(index_int);};
  private:
    std::unique_ptr<Products::Product> m_product;
  };
}
 

full-wrapper.cpp

 BOOST_PYTHON_MODULE(alucard)
  {
    class_<Products::ProductBuilder>("ProductBuilder", init<std::map<std::string,std::string>,std::deque<std::string>>())
    .def("build", amp;Products::ProductBuilder::build)
    .def("numQueue", amp;Products::ProductBuilder::numQueue)
    .def("getQueueByIndex", amp;Products::ProductBuilder::getQueueByIndex)
    ;
  }
 

Ошибки, которые я получаю при сборке библиотеки с помощью cmake, заключаются в следующем:

 /usr/include/boost/python/object/value_holder.hpp:133:13: error: use of deleted functionProducts::ProductBuilder::ProductBuilder(const Products::ProductBuilderamp;)’
             BOOST_PP_REPEAT_1ST(N, BOOST_PYTHON_UNFORWARD_LOCAL, nil)
             ^
In file included from /home/jlahowetz2/development/cpp-python-wrapper/full-wrapper.cpp:11:0:
/data/alucard/include/ProductBuilder.h:25:9: note: ‘Products::ProductBuilder::ProductBuilder(const Products::ProductBuilderamp;)’ is implicitly deleted because the default definition would be ill-formed:
   class ProductBuilder
         ^~~~~~~~~~~~~~
/data/alucard/include/ProductBuilder.h:25:9: error: use of deleted functionstd::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>amp;) [with _Tp = Products::Product; _Dp = std::default_delete<Products::Product>]’
In file included from /usr/include/c  /7/memory:80:0,
                 from /usr/include/boost/function/function_base.hpp:16,
                 from /usr/include/boost/function/detail/prologue.hpp:17,
                 from /usr/include/boost/function/function_template.hpp:13,
                 from /usr/include/boost/function/detail/maybe_include.hpp:13,
                 from /usr/include/boost/function/function0.hpp:11,
                 from /usr/include/boost/python/errors.hpp:13,
                 from /usr/include/boost/python/handle.hpp:11,
                 from /usr/include/boost/python/args_fwd.hpp:10,
                 from /usr/include/boost/python/args.hpp:10,
                 from /usr/include/boost/python.hpp:11,
                 from /home/jlahowetz2/development/cpp-python-wrapper/full-wrapper.cpp:1:
/usr/include/c  /7/bits/unique_ptr.h:383:7: note: declared here
       unique_ptr(const unique_ptramp;) = delete;
       ^~~~~~~~~~
 

Ответ №1:

По-видимому, код Python копирует ваш объект ProductBuilder . Однако ProductBuilder содержит unique_ptr, который нельзя скопировать (его можно только переместить). Один из простых способов исправить это — заменить unique_ptr на shared_ptr, который можно копировать.

Комментарии:

1. Думаю, вы были правы, добавление class_<Products::ProductBuilder, boost::noncopyable> вызвало его компиляцию, но теперь я не могу импортировать код в python, поскольку он возвращает ошибку segfault