【问题标题】:error: invalid conversion from method to void*错误:从方法到无效的无效转换*
【发布时间】:2014-11-07 02:07:29
【问题描述】:

我正在尝试将方法强制转换为 void 指针,以便可以将其用作回调方法。

void* pVoidedFunc = &testmethod;

但我得到了错误:

error: invalid conversion from int (*)() to void*

方法是:

static int testmethod()
{
   return 0;
}

如何将方法转换为 void 指针?

【问题讨论】:

  • 为什么要将方法转换为 void 指针?
  • 如果这是一个回调方法,那么将指针传递给回调方法应该有正确的签名,而不是使用通用的 void*。
  • 你也想用什么来喂空 *?
  • 你的函数指针真的需要一个 void * 吗?这真是一个糟糕的设计。如果回调是一个不带参数并返回 int 的函数,则应该这样声明。当然,调用回调的代码会将 void* 转换为指向不带参数并返回 int 的函数的指针。忽略所有的说教,你需要一个 (void *) 演员来修复错误。

标签: c++


【解决方案1】:

该语言不允许将指向函数的指针自动转换为 void 指针。

以下是 C++ 草案标准 (N3337) 关于指针转换的说明(重点是我的):

4.10 指针转换

2 “指向 cv T 的指针”类型的右值,其中T 是对象类型,可以转换为“指针”类型的右值到 cv void。”将“指向 cv T 的指针”转换为“指向 cv void 的指针”的结果指向类型对象的存储位置的开始T 驻留,就好像该对象是 T 类型的最派生对象 (1.8)(即,不是基类子对象)。

函数不是对象。这在:

1.8 C++ 对象模型

1 C++ 程序中的构造创建、销毁、引用、访问和操作对象。 object 是一个存储区域。 [注意: 函数不是对象,无论它是否像对象那样占用存储空间。 ]

对象类型定义为:

3.9 类型

9 对象类型是一种(可能是 cv 限定的)类型,它不是函数类型、引用类型,也不是 void 类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多