微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Boost.Python没有匹配功能

如何解决Boost.Python没有匹配功能

因此,这些天我一直在学习Boost.Python,但我遇到了这个问题,无法理解为什么会发生这种情况,也无法理解如何解决。我为复制此问题而编写的伪代码如下:

#include <map>
#include <string>
#include <boost/python.hpp>
using namespace boost::python;

struct A {
private:
  double val;
public:
  A (double val) {
    this->val = val;
  }
  double get() {
    return this->val;
  }
  void set(double val) {
    this->val = val;
  }
};

struct B {
private:
  std::map<std::string,A> dict;
public:
  B ();
  double get(std::string key) {
    return this->dict[key].get();
  }
  void set(std::string key,double val) {
    this->dict[key] = A(val);
  }
};

BOOST_PYTHON_MODULE(core) {
  class_<B>("B")
    .def("get",&B::get)
    .def("set",&B::set);
}

我正在使用setuptools扩展来对其进行编译,因此将自动生成以下编译命令:

x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -I/home/gabriel-milan/sandBox/BoostTest/ -I/usr/include/python3.7m -c BoostTest/core.cpp -o build/temp.linux-x86_64-3.7/BoostTest/core.o

以防万一,我的setup.py文件看起来像这样:

from setuptools import setup,find_packages
from setuptools.extension import Extension

extensions = [
  Extension(
    "BoostTest.core",sources=["BoostTest/core.cpp"],libraries=["boost_python3"],),]

setup (
  name='BoostTest',packages=find_packages(),ext_modules=extensions,)

最后,我得到的输出如下:

...
BoostTest/core.cpp:30:26:   required from here
/usr/include/c++/8/tuple:1668:70: error: no matching function for call to ‘A::A()’
         second(std::forward<_Args2>(std::get<_Indexes2>(__tuple2))...)
                                                                      ^
BoostTest/core.cpp:13:3: note: candidate: ‘A::A(double)’
   A (double val) {
   ^
BoostTest/core.cpp:13:3: note:   candidate expects 1 argument,0 provided
BoostTest/core.cpp:9:8: note: candidate: ‘constexpr A::A(const A&)’
 struct A {
        ^
BoostTest/core.cpp:9:8: note:   candidate expects 1 argument,0 provided
BoostTest/core.cpp:9:8: note: candidate: ‘constexpr A::A(A&&)’
BoostTest/core.cpp:9:8: note:   candidate expects 1 argument,0 provided

在这种情况下,我希望只有B暴露给Python。因此,A不在BOOST_PYTHON_MODULE上。无论如何,我尝试在其中添加A,但不起作用。我是Boost.Python的新手,请您帮帮我吗?

解决方法

B::get中,您有一行return this->dict[key].get();。这比您最初想象的要复杂。特别是,地图的[]运算符将插入一个不存在的元素。为此,它需要能够默认构造此新元素。由于您的地图将A对象存储为值,因此您的类A必须是默认可构造的。

只需将默认构造函数添加到class A

A(): val(0) { }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?