簡體   English   中英

Boost.Python 上沒有匹配的 function

[英]No matching function on 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,
)

最后,我得到的output如下:

...
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(); . 這比您最初想象的要復雜。 特別是,map 的[]運算符將插入一個不存在的元素。 為此,它需要能夠默認構造這個新元素。 由於您的 map 將A對象存儲為值,因此您的 class A需要默認可構造。

只需將默認構造函數添加到class A

A(): val(0) { }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM