为了账号安全,请及时绑定邮箱和手机立即绑定

无法在 pybind11 中绑定重载的静态成员函数

无法在 pybind11 中绑定重载的静态成员函数

德玛西亚99 2022-01-05 20:34:44
我试图用 pybind11 绑定静态重载函数,但遇到了一些问题。这是示例代码#include <pybind11/pybind11.h>namespace py = pybind11;class TESTDB {  public:    static void aaaa(int a, int b) {printf("aaaaa");};    static void aaaa(int a) {printf("xxxxx");};};PYBIND11_MODULE(example, m) {  py::class_<TESTDB>(m, "db")     .def_static("aaaa", (void (TESTDB::*)(int, int)) &TESTDB::aaaa);}但由于编译失败error: no matches converting function ‘aaaa’ to type ‘void (class TESTDB::*)(int, int)’   .def_static("aaaa", (void (TESTDB::*)(int, int)) &TESTDB::aaaa); note: candidates are: static void TESTDB::aaaa(int) static void aaaa(int a) {printf("xxxxx");}; note:                 static void TESTDB::aaaa(int, int) static void aaaa(int a, int b) {printf("aaaaa");};任何的想法?
查看完整描述

2 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

问题是你的演员(void (TESTDB::*)(int, int))。该转换将指向静态成员函数的指针转换为指向静态成员函数的指针,这是不正确的。

由于函数是静态的,您应该简单地将它们转换为指向普通非成员函数的指针:

py::class_<TESTDB>(m, "db")
    .def_static("aaaa", static_cast<void (*)(int, int)>(&TESTDB::aaaa));


查看完整回答
反对 回复 2022-01-05
?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

仅供参考 - 首先,C++ 标准草案n3337(本质上是 C++11)的8.3.1 指针 [dcl.ptr] / 1

在声明 TD 中,其中 D 具有以下形式

* attribute-specifier-seq cv-qualifier-seq D1

并且声明 T D1 中的标识符的类型是“ derived-declarator-type-list T”,那么 D 的标识符的类型是“ derived-declarator-type-list cv-qualifier-seq指向 T 的指针”。...

8.3.3 成员指针 [dcl.mptr] / 1状态

在声明 TD 中,其中 D 具有以下形式

nested-name-specifier * attribute-specifier-seq cv-qualifier-seq D1

并且nested-name-specifier表示一个类,声明T D1中标识符的类型是“ derived-declarator-type-list T”,那么D的标识符的类型是“ derived-declarator-type-”列出 指向T 类型嵌套名称说明符类成员的cv-qualifier-seq指针。...

这些语句意味着我们必须在当且仅当函数是成员函数时使用上面的嵌套名称说明符 TESTDB::TESTDB::*TESTDB::aaaa

接下来,5.2.2 函数调用【expr.call】状态

  1. 函数调用有两种:普通函数调用和成员函数63(9.3)调用。...

在脚注63

63 ) 静态成员函数 (9.4) 是一个普通函数

这意味着您的静态成员函数TESTDB::aaaa是一个普通函数,而不是一个成员函数。因此,您不得TESTDB::在当前演员表中指定。


总之,您必须消除TESTDB::aaaa像这样的两个重载的歧义:

现场演示

static_cast<void (*)(int, int)>(&TESTDB::aaaa)


查看完整回答
反对 回复 2022-01-05
  • 2 回答
  • 0 关注
  • 330 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号