GCC 问题 - 从 'void (*)(MyObject*, bool)' 到 'const void*' 的转换无效
GCC problem - invalid conversion from 'void (*)(MyObject*, bool)' to 'const void*'
我真的不想,但我必须在我的程序中模拟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++中实现良好的引用计数的例子。- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 从"const void*"到"PVOID {aka void*}"[-fall
- 将返回类型专用化为 void 或 const 左值引用
- 不能使这种类型的"void(C::* volatile)(int) const "在参考手册C++示
- 错误:对类型 'const ItemInstance' 的引用无法绑定到类型 'void' 的右值
- 错误:从'void*'到'const uint8_t* {aka const unsigned char*}'的转换无效 [-允许]
- template<class T, int N> void h(T const(&)[N]); as friend function
- 'void (*)(const char*)' 'void (*)()' [-允许]
- 从 'void *' 转换为 'const std::string *&' 必须具有所有中间指针 const 合格
- Python ctypes and void const pointers
- Casting a const void*
- SFML 和 Box2D SetUserData 无法将参数从 const char [4] 转换为 void *
- 警告:'virtual void wxWindowBase::SetInitialBaseSize(const wxSize&)'已弃用
- typedef void (*print_type) (const char*);
- :void setData(const Color * & data_ptr)中的 *& 是什么意思;
- 将所有权从 unique_ptr<T,void(*)(T*)> 转移到 unique_ptr<const T,void(*)(const T*>
- 使用 LLVM 从 const void * 转换为模板类型时出现问题
- 将 std::function 作为参数传递,const void *
- 了解 void f(const T¶m) 中的参数类型
- CA::release_objects(X::List<void const*>*)