为什么这个 pointer_cast 失败了?
Why does this pointer_cast fail?
这个 if
测试工作正常(已经做了很多年):
if (m_pMapSPtrEvents->Lookup(strKey, (void*&)psEvent))
{
if (psEvent != nullptr)
{
bActivate = TRUE;
strTipText = psEvent->strEvent;
}
}
但是如果我把它改成:
if (m_pMapSPtrEvents->Lookup(strKey, pointer_cast<void*&>(psEvent)))
{
if (psEvent != nullptr)
{
bActivate = TRUE;
strTipText = psEvent->strEvent;
}
}
其中`pointer_cast是:
template<typename T, typename U> static T inline pointer_cast(U src) noexcept
{
static_assert(sizeof(T) >= sizeof(U), "Invalid pointer cast"); // Check sizes!
__pragma(warning(suppress:26490)) // Note: no semicolon after this expression!
return reinterpret_cast<T>(src);
}
失败了。铸造我的结构指针 (SPECIAL_EVENT_S *psEvent
) 的现代方法是什么?
m_pMapSPtrEvents
属于 CMapStringToPtr
.
类型
我要指出:
- 我在 IDE 中没有看到任何视觉警告。
- 编译没有错误。
- 当我 运行 它没有断言。
- 但它不会检测到
if
子句,因此不会显示工具提示。
...除非我恢复到 c 风格转换。
更新
如果我按照建议删除 &
,我会收到构建错误:
4>MyMonthCalCtrl.cpp
4>D:\My Programs22\MeetSchedAssist\Meeting Schedule Assistant\MyMonthCalCtrl.cpp(72,8): error C2664: 'BOOL CMapStringToPtr::Lookup(LPCTSTR,void *&) const': cannot convert argument 2 from 'T' to 'void *&'
4> with
4> [
4> T=void *
4> ]
4>C:\Program Files\Microsoft Visual Studio22\Preview\VC\Tools\MSVC.30.30704\atlmfc\include\afxcoll.h(1264,7): message : see declaration of 'CMapStringToPtr::Lookup'
4>Done building project "Meeting Schedule Assistant.vcxproj" -- FAILED.
我相信有人会整理一个描述为什么 pointer_cast
失败的答案——他们比我更能解释。
解决方法
我的回答提供了解决方法。考虑到这些警告的上下文(MFC 应用程序)并考虑到存在必须使用 reinterpret_cast
的有效实例,我已将以下行添加到我的 stdafx.h
文件中:
#pragma warning( disable : 26490)
并使用查找/替换将所有 pointer_cast
还原为 reinterpret_cast
。该应用程序现在运行正常。
这个 if
测试工作正常(已经做了很多年):
if (m_pMapSPtrEvents->Lookup(strKey, (void*&)psEvent))
{
if (psEvent != nullptr)
{
bActivate = TRUE;
strTipText = psEvent->strEvent;
}
}
但是如果我把它改成:
if (m_pMapSPtrEvents->Lookup(strKey, pointer_cast<void*&>(psEvent)))
{
if (psEvent != nullptr)
{
bActivate = TRUE;
strTipText = psEvent->strEvent;
}
}
其中`pointer_cast是:
template<typename T, typename U> static T inline pointer_cast(U src) noexcept
{
static_assert(sizeof(T) >= sizeof(U), "Invalid pointer cast"); // Check sizes!
__pragma(warning(suppress:26490)) // Note: no semicolon after this expression!
return reinterpret_cast<T>(src);
}
失败了。铸造我的结构指针 (SPECIAL_EVENT_S *psEvent
) 的现代方法是什么?
m_pMapSPtrEvents
属于 CMapStringToPtr
.
我要指出:
- 我在 IDE 中没有看到任何视觉警告。
- 编译没有错误。
- 当我 运行 它没有断言。
- 但它不会检测到
if
子句,因此不会显示工具提示。
...除非我恢复到 c 风格转换。
更新
如果我按照建议删除 &
,我会收到构建错误:
4>MyMonthCalCtrl.cpp
4>D:\My Programs22\MeetSchedAssist\Meeting Schedule Assistant\MyMonthCalCtrl.cpp(72,8): error C2664: 'BOOL CMapStringToPtr::Lookup(LPCTSTR,void *&) const': cannot convert argument 2 from 'T' to 'void *&'
4> with
4> [
4> T=void *
4> ]
4>C:\Program Files\Microsoft Visual Studio22\Preview\VC\Tools\MSVC.30.30704\atlmfc\include\afxcoll.h(1264,7): message : see declaration of 'CMapStringToPtr::Lookup'
4>Done building project "Meeting Schedule Assistant.vcxproj" -- FAILED.
我相信有人会整理一个描述为什么 pointer_cast
失败的答案——他们比我更能解释。
解决方法
我的回答提供了解决方法。考虑到这些警告的上下文(MFC 应用程序)并考虑到存在必须使用 reinterpret_cast
的有效实例,我已将以下行添加到我的 stdafx.h
文件中:
#pragma warning( disable : 26490)
并使用查找/替换将所有 pointer_cast
还原为 reinterpret_cast
。该应用程序现在运行正常。