将成员函数指针传递给C样式函数

矮牵牛

我正在尝试将成员函数指针传递给c样式函数(因为它在C语言中是lib)

它想要的指针定义为:

void (*)(int, const char*)

所以我想传递的函数是:

void Application::onError(int error, const char *description)

我正在尝试通过以下代码传递它:

setCallback(bind(&Game::onError, this, placeholders::_1, placeholders::_2));

这给了我以下错误:

cannot convert ‘std::_Bind_helper<false, void (Application::*)(Application*, int,
const char*), Application* const, const std::_Placeholder<1>&, const 
std::_Placeholder<2>&>::type {aka std::_Bind<std::_Mem_fn<void (Application::*)
(Application*, int, const char*)>(Application*, std::_Placeholder<1>,
std::_Placeholder<2>)>}’ to ‘GLFWerrorfun {aka void (*)(int, const char*)}’ for 
argument ‘1’ to ‘void (* glfwSetErrorCallback(GLFWerrorfun))(int, const char*)’
glfwSetErrorCallback(bind(&Application::onError, this, placeholders::_1, placeholders::_2));

有什么方法可以成功地将成员函数作为绑定函数传递给c样式函数?

Angew不再为SO感到骄傲

结果std::bind是一个复杂的C ++对象。例如,它必须存储所有绑定的参数。因此,它绝对不能转换为函数指针。

您正在处理的回调规范显然不允许“用户数据”有效负载,因此没有地方可以隐藏指向可用于调用非静态成员函数的C ++对象的指针。这意味着您将必须调用全局或静态成员函数,或诉诸于全局/静态成员/每个线程变量来存储对象指针。

唯一100%可移植的方法是创建一个C链接函数用作回调。这样做,并使用全局对象指针来调用原始对象onError()

Application *error_handling_application;

extern "C" void errorCallback(int error, const char *description)
{
  error_handling_application->onError(error, description);
}

请注意,您经常会遇到使用静态成员函数代替my的程序errorCallback这适用于大多数平台上的大多数编译器,但不能保证能正常工作。C库期望具有C语言链接的功能。静态成员函数只能具有C ++语言链接。C函数和C ++函数的调用机制可能会有所不同(取决于ABI),这将导致对传入的静态成员函数的调用格式错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将成员函数指针传递给std :: function

来自分类Dev

将成员函数指针作为参数传递给模板方法

来自分类Dev

将成员函数指针传递给父类

来自分类Dev

将成员函数传递给模板函数

来自分类Dev

C ++如何将成员函数指针传递给另一个类?

来自分类Dev

如何将成员函数指针传递给采用常规函数指针的函数?

来自分类Dev

将成员函数传递给glfwSet * Callback

来自分类Dev

将成员或非成员函数指针作为参数传递

来自分类Dev

使用指向成员的指针将成员函数作为参数传递

来自分类Dev

将成员或非成员函数指针作为参数传递

来自分类Dev

将成员函数传递给可变参数模板函数

来自分类Dev

将成员函数作为参数传递给函数模板

来自分类Dev

Fortran:将成员过程传递给外部函数

来自分类Dev

将成员函数和 lambda 传递给 std::function

来自分类Dev

C ++将指针传递给非静态成员函数

来自分类Dev

C ++将成员函数传递给另一个类

来自分类Dev

将成员函数传递给任意精度的C ++正交库(Quadpack ++)

来自分类Dev

C ++ / Boost:将成员函数作为参数传递给boost :: bind

来自分类Dev

将成员函数传递给任意精度的C ++正交库(Quadpack ++)

来自分类Dev

如何使用C ++将成员的名称从结构作为参数传递给函数?

来自分类Dev

如何将(非静态成员函数的)C ++函数指针传递给预定义的C函数?

来自分类Dev

Boost C ++。将带有签名指针的成员函数指针传递给函数

来自分类Dev

C ++ 11-将成员函数传递给线程会给出:没有重载函数需要2个参数

来自分类Dev

将公共成员函数指针传递给构造函数

来自分类Dev

将指针传递给成员函数作为void *函数的参数

来自分类Dev

避免类作用域,以便将成员函数作为函数指针传递

来自分类Dev

将成员函数地址传递给另一个类的函数

来自分类Dev

将成员函数传递给模板函数时出现语法错误

来自分类Dev

C ++是否有定义的方法将指针传递给类的成员对象的成员函数?

Related 相关文章

  1. 1

    如何将成员函数指针传递给std :: function

  2. 2

    将成员函数指针作为参数传递给模板方法

  3. 3

    将成员函数指针传递给父类

  4. 4

    将成员函数传递给模板函数

  5. 5

    C ++如何将成员函数指针传递给另一个类?

  6. 6

    如何将成员函数指针传递给采用常规函数指针的函数?

  7. 7

    将成员函数传递给glfwSet * Callback

  8. 8

    将成员或非成员函数指针作为参数传递

  9. 9

    使用指向成员的指针将成员函数作为参数传递

  10. 10

    将成员或非成员函数指针作为参数传递

  11. 11

    将成员函数传递给可变参数模板函数

  12. 12

    将成员函数作为参数传递给函数模板

  13. 13

    Fortran:将成员过程传递给外部函数

  14. 14

    将成员函数和 lambda 传递给 std::function

  15. 15

    C ++将指针传递给非静态成员函数

  16. 16

    C ++将成员函数传递给另一个类

  17. 17

    将成员函数传递给任意精度的C ++正交库(Quadpack ++)

  18. 18

    C ++ / Boost:将成员函数作为参数传递给boost :: bind

  19. 19

    将成员函数传递给任意精度的C ++正交库(Quadpack ++)

  20. 20

    如何使用C ++将成员的名称从结构作为参数传递给函数?

  21. 21

    如何将(非静态成员函数的)C ++函数指针传递给预定义的C函数?

  22. 22

    Boost C ++。将带有签名指针的成员函数指针传递给函数

  23. 23

    C ++ 11-将成员函数传递给线程会给出:没有重载函数需要2个参数

  24. 24

    将公共成员函数指针传递给构造函数

  25. 25

    将指针传递给成员函数作为void *函数的参数

  26. 26

    避免类作用域,以便将成员函数作为函数指针传递

  27. 27

    将成员函数地址传递给另一个类的函数

  28. 28

    将成员函数传递给模板函数时出现语法错误

  29. 29

    C ++是否有定义的方法将指针传递给类的成员对象的成员函数?

热门标签

归档