C++ 函数回调:无法从成员函数转换为函数签名

2024-03-03

我正在使用第三方库,它允许我注册某些事件的回调。寄存器函数看起来像这样。它使用回调签名。

typedef int (*Callback)(std::string);

void registerCallback(Callback pCallback) {
//it gets registered
}

我的问题是我想将成员函数注册为回调,如下所示

struct MyStruct {
    MyStruct();
    int myCallback(std::string str);
};

MyStruct::MyStruct() {
    registerCallback(&MyStruct::myCallback);
}

int MyStruct::myCallback(std::string str) {
    return 0;
}

当然,编译器会抱怨说

错误 C2664: 'registerCallback' : 无法将参数 1 从 'int (__thiscall MyStruct::* )(std::string)' 转换为 'Callback'

我一直在研究像 function 和 bind 这样的 boost 库,但这些库似乎都不能解决问题。我一直在谷歌上搜索答案,但我什至不知道该怎么称呼它,所以它没有多大帮助。

提前致谢。


您试图将成员函数指针作为普通函数指针传递,这是行不通的。成员函数必须具有this指针作为隐藏参数之一,而普通函数则不然,因此它们的类型不兼容。

You can:

  1. 更改参数的类型以接受成员函数并接受实例作为调用对象
  2. 停止尝试传递成员函数并传递普通函数(也许通过使函数static)
  3. 有一个普通函数,它接受类的实例、成员函数指针和std::string并使用类似 boost 的东西bind绑定前两个参数
  4. 使回调注册函数接受函子对象,或者std::function(我想就是这个名字)
  5. 还有许多其他方法,我不会在这里详细介绍,但您应该明白了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 函数回调:无法从成员函数转换为函数签名 的相关文章

  • C# 中的简单获取字符串(忽略末尾的数字)

    我认为正则表达式太过杀伤力 而且它需要我一些时间来编写一些代码 我想我现在应该学习 因为我知道一些正则表达式 分隔字母数字字符串中的字符串的最简单方法是什么 它将永远是 LLLLDDDDD 我只想要字母 l 通常只有 1 或 2 个字母 T
  • 获取 WSA 错误代码的格式化消息

    我在 win32 C 应用程序中使用winsock2 我将使用 MessageBox 显示可以通过调用 WSAGetLastError 检索的网络错误 我怎样才能做到这一点 我看到 FormatMessage 但我不明白如何使用它 例如 以
  • DataGridView 自动完成组合框列不保留初始单元格离开时的值

    我有一个带有自动完成组合框列的绑定 dataGridView 并且自动完成功能正在工作 只是我观察到一种有点令人恼火的行为 当我第一次在自动完成单元格中键入文本并使用 tabKey 移动到下一个单元格时 我的选择不会保留 我选择的内容将被清
  • Linux 缓冲区溢出环境变量

    我一直在审查不同类型的缓冲区溢出 并遇到了一个我不记得为什么会发生的问题 下面的代码是我尝试执行缓冲区溢出的程序 include
  • 将 MyGeneration 与 Fluent NHibernate 结合使用

    我在这里找到了一个使用 MyGeneration 生成 NHibernate 代码的绝佳模板 http vucetica blogspot com 2009 01 nhibernate template for my Generation
  • 正确别名向量

    我无法在其他地方找到答案 所以我想我只需要问这个 我正在尝试获取向量 其中存储 int 指针 的别名 如下所示 void conversion Engine ENGINES The Engine class has a vector of
  • JObject ToString 与 StringEnumConverter 不起作用

    我正在尝试序列化一个匿名类 如下所示 public enum ErrorCode A B C var response JObject FromObject new Error new Message Test Code ErrorCode
  • 如何设置属性选择器的值 Expression>

    我需要使用模式工厂的想法将 Person 类实体中的实体属性 Address 与 FactoryEntities 类中的表达式 linq 相关联 看看这就是我所拥有的并且我想要做的 Address address new Address a
  • 在 WinForms 中显示输入对话框

    我想在我的 WinForm 应用程序中显示输入模式 我浏览过网络 但没有找到执行此操作的良好模式 我知道我必须创建另一个表单 并使用 ShowDialog 方法 你是对的 请注意 模式对话框在关闭时不会自动处理 与非模式对话框不同 因此您需
  • 如何创建 .bat 文件来运行 C# 代码?

    我需要的是 我有一个 C 代码 我想构建它以便在桌面上创建一个 bat 文件 因此 当我从桌面运行这个 bat 文件时 它应该执行 C 代码 有没有办法在编译之前更改 c 项目的设置或属性 以便创建应运行此 c 代码的 bat 文件 将 C
  • Clang 使用 -nostdlib 生成崩溃代码

    我正在尝试为可执行文件设置自己的运行时环境 但无法使用 clang v3 4 1ubuntu1 目标 x86 64 pc linux gnu 来生成没有段错误的可执行文件 我已将问题简化为以下内容 如果我有一个文件 crt1 c 除了满足
  • 枚举和枚举类之间的区别[重复]

    这个问题在这里已经有答案了 谁能解释一下两者之间的区别 enum Type1 type2 And enum class Type1 type2 我经常使用前者 可能太频繁而没有足够的封装 但我从未使用过第二个例子 Thanks enum A
  • 更改子进程中的 iostream

    现在 我正在开发一个项目 其中我需要启动一个子进程来使用 C 在 Linux 中执行一个新程序 并且我需要重定向标准输入和输出 就像在 C 中一样 它们是cin and cout 到一个文件 这意味着在子进程中 标准输入和输出都是文件 子进
  • 为什么这是一个未定义的行为?

    我的回答这个问题 https stackoverflow com q 18706587 845092这个函数是 inline bool divisible15 unsigned int x 286331153 2 32 1 15 40086
  • ASP.NET MVC - 路由 - 具有文件扩展名的操作

    有没有办法实现调用URLhttp mywebsite myarea mycontroller myaction xml这基本上是 假 请求文件 但结果将是一个为动态创建的文件提供服务的操作操作 我试过这个 context MapRoute
  • C# 中的自定义按钮:如何删除悬停背景?

    我正在尝试使用 Visual Studio 2005 对我的表单 其 FormBorderStyle none 执行自定义按钮 我在链接到该按钮的 ImageList 中有我的 3 种状态按钮图像 this btnClose AutoSiz
  • 如何避免函数的多重定义(Linux、GCC/G++、Code::Blocks)

    我有一个代码块项目 它使用许多不同的文件 通常是由其他程序员编写的 目前我遇到的情况是 我有两个不同的子项目 其中包含以相同方式命名的函数 比方说 F int x 因此 F int x 是在两个不同位置的两个源文件中定义的 并且它们有两个不
  • 使用全局 Web API 过滤器属性进行 Unity 依赖注入

    参考这个CodePlex 统一文章 http unity codeplex com discussions 446780我能够使用 WebAPI 控制器获取过滤器属性 如下所示 MyFilterAttribute public class
  • C++ 头文件包含

    我正在开发一个项目 每个头文件都有一个预处理器包含防护 我的包含是这样的 文件 gt 包含 main cpp gt header h 字符 h header h gt 矢量 iostream DataFiles h Character h
  • XslCompiledTransform 和自定义 XmlUrlResolver:“具有相同键的条目已存在”

    有没有办法调试由自定义 XmlUrlResolver 从数据库加载的 XSLT 文档 或者有人知道下面的错误消息是关于什么的吗 我有一个导入通用 xslt 文档的 XSLT 样式表

随机推荐