我正在尝试创建到自定义向量类Vec3
的绑定,该类继承自固定大小的矩阵类Eigen::Vector3d
,具有一个复制构造函数并实现一些附加方法。在我尝试调用派生类的方法之前,一切都很正常,在那里我得到了一个incompatible function arguments
错误,即使这些方法不带任何参数
bindings.cpp:
#include <Eigen/Core>
#include "pybind11/pybind11.h"
#include "pybind11/eigen.h"
namespace py = pybind11;
class Vec3 : public Eigen::Vector3d {
public:
Vec3() : Eigen::Vector3d() {}
Vec3(const Eigen::Vector3d& v) : Eigen::Vector3d(v) {}
Vec3(int rows, int cols) : Vec3() {} // This constructor is needed for a problem-unrelated reason
int f() { return 123; } // I want to call this dummy method in python
};
PYBIND11_MODULE(Minimal, m) {
py::class_<Vec3>(m, "Vec3")
.def(py::init<>())
.def(py::init<const Eigen::Vector3d&>())
.def("f", &Vec3::f);
}
我使用的是pybind11版本2.4.3。CMakeLists.txt:
cmake_minimum_required(VERSION 3.10)
project(Minimal)
find_package(Eigen3 REQUIRED NO_MODULE)
set(PYBIND11_CPP_STANDARD -std=c++17)
set(PYBIND11_PYTHON_VERSION 3.6)
add_subdirectory(pybind11)
pybind11_add_module(Minimal "${CMAKE_CURRENT_LIST_DIR}/bindings.cpp")
target_link_libraries(Minimal PRIVATE Eigen3::Eigen)
经过编译,结果如下:
$ python3 -c "from Minimal import Vec3; v = Vec3([0, 0, 0]); print(v.f());"
Traceback (most recent call last):
File "<string>", line 1, in <module>
TypeError: f(): incompatible function arguments. The following argument types are supported:
1. (self: numpy.ndarray[float64[3, 1]]) -> int
Invoked with: <Minimal.Vec3 object at 0x7f4561fd35a8>
我怀疑pybind11可能没有意识到Vec3
继承自Eigen::Vector3d
,所以我明确指示它这样做
PYBIND11_MODULE(Minimal, m) {
py::class_<Eigen::Vector3d>(m, "Vector3d");
py::class_<Vec3, Eigen::Vector3d>(m, "Vec3")
.def(py::init<>())
.def(py::init<const Eigen::Vector3d&>())
.def("f", &Vec3::f);
// These two lines also didn't help
// py::implicitly_convertible<Eigen::Vector3d, Vec3>();
// py::implicitly_convertible<Vec3, Eigen::Vector3d>();
}
不幸的是,我遇到了与上述相同的错误。有人能帮我吗
尝试删除或注释掉:#包括“pybind11/eigen.h”
相关问题 更多 >
编程相关推荐