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

时间:2011-04-29 13:47:14

标签: c++ pointers gcc com

我真的不想这样,但我必须在我的程序中模拟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的参数1(const void *,const char *,int,const void *)const'

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

您是否发布了编译的相同代码?

错误消息“从void (*)(MyObject*, bool)无效转换...”显然是指此示例中的函数void test (MyObject* pObject, bool bValue)的(地址)。但是你没有在应该出错的行上引用test

答案 2 :(得分:0)

void ()(MyObject, bool)之类的函数指针和void *之类的数据指针不能保证大小相同(当然不是C标准;我假设不是C ++标准)。 POSIX确实授予了这种保证,但语言标准没有。

有时候,你可以解决工会的问题:

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

您可以分配给函数成员并从数据成员中读取,即使标准不能保证它将起作用,除非sizeof(void *) != sizeof(void (*)()),它将在实践中起作用。

答案 3 :(得分:0)

您发布的代码与您提供的说明/消息不符。我非常怀疑可以从此代码中获取这些错误消息。

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

我的猜测是你发错了代码。

BTW,您尝试模拟的COM逻辑部分(至少到目前为止)被称为引用计数。它有自己的值,没有专门附加到COM。你可以在网上用C ++找到很多实现良好的引用计数的例子。