GCC 问题 - 从 'void (*)(MyObject*, bool)' 到 'const void*' 的转换无效

GCC problem - invalid conversion from 'void (*)(MyObject*, bool)' to 'const void*'

本文关键字:void const 无效 bool 转换 MyObject 问题 GCC      更新时间:2023-10-16

我真的不想,但我必须在我的程序中模拟COM逻辑,我使用标准的COM_ADDREF宏,但我不断得到以下错误:从'void ()(MyObject, bool)'到'const void*'无效转换…我该怎么办?

#define COM_ADDREF(pObj, pMaster) ((pObj)->AddRef((pMaster), __FILE__, __LINE__, pObj))
class BaseComObject
{
public:
    inline DWORD AddRef (const void* pMaster, const char* pFileName, int line, const void* pObj) const
    {
        iRefCount++;
        return iRefCount;
    };
    inline DWORD GetRefCount() const
    {
        return iRefCount;
    };
private:
    long iRefCount;
};
class MyObject: public BaseComObject { };
void test (MyObject* pObject, bool bValue)
{
    if (pObject)
    {
        COM_ADDREF (pObject, bValue);// error: invalid conversion from 'void (*)(MyObject*, bool)' to 'const void*'
    }
}

错误:无效转换从'void ()(MyObject, bool)'到'const void*'

错误:初始化'DWORD BaseComObject::AddRef(const void*, const char*, int, const void*) const'

在我看来,这不是产生错误的代码。当我用g++编译它时(在const函数中修复了DWORD和修改类状态等明显的错误),它只是告诉我找不到匹配的函数。

要点是您将bool作为第二个参数传递给COM_ADDREF,并且基类AddRef函数实际上需要在该参数位置上的void*。我高度怀疑你有一个隐式bool构造函数的类,你没有向我们展示,这真的让编译器感到困惑。

您发布的代码与您编译的相同吗?

错误信息"invalid conversion from void (*)(MyObject*, bool)…"在这个例子中,显然是指函数void test (MyObject* pObject, bool bValue)的地址。但是您没有在应该有错误的行中引用test

函数指针如void ()(MyObject, bool)和数据指针如void *不能保证是相同的大小(当然不是C标准;我想也不是c++标准)。POSIX确实提供了这种保证,但是语言标准没有。

有时,您可以使用并集来解决这个问题:

union DataFunction
{
    void  *data;
    void (*function)();
};

可以给函数成员赋值并从数据成员中读取,尽管标准不保证这样做,但除非sizeof(void *) != sizeof(void (*)()),否则它在实践中是可行的。

您发布的代码与您提供的描述/消息不匹配。我非常怀疑有人能从这段代码中得到这些错误信息。

你的代码明显试图传递const void *参数的bool参数,这确实是一个错误:你将bool bValue参数作为const void* pMaster参数传递给AddRef。但是这个错误的诊断信息应该完全不同。

我猜你发错代码了。

顺便说一句,你试图模拟的COM逻辑部分(至少到目前为止)被称为引用计数。它有自己的值,没有特别附加到COM。您可以在网上找到相当多的c++中实现良好的引用计数的例子。