我真的不想这样,但我必须在我的程序中模拟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'
答案 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 ++找到很多实现良好的引用计数的例子。