error C2440: 'specialization' : cannot convert from 'int (__stdcall *)(void *)' to ' (__stdcall *)()'

船长77 2005-05-01 09:43:44
template<class T, class CloseT, CloseT (_stdcall * CloseFunc)(T)> class THandle {
T m_h;
public:
THandle() {
m_h = T(-1); // Always illegal
}
THandle(T h) { m_h = h; }
~THandle() {
if (IsValid()) Close(); // Ensure we do not double-close
}
THandle<T, CloseT, CloseFunc>& operator=(T h) {
m_h = h;
return *this;
}
operator T() { return m_h; }
T *operator &() { return &m_h; }
CloseT Close() {
T h = m_h;
m_h = T(-1);
return (*CloseFunc)(h); // Return the result of whatever type
};
BOOL IsValid() { return m_h != T(-1) && m_h != T(0); }
};
//
// Now define common handles as safe classes.
//
typedef class THandle<HANDLE, BOOL, &CloseHandle> CHandle;
typedef class THandle<HKEY, LONG, ®CloseKey> CHKey;
typedef class THandle<HANDLE, BOOL, &CloseHandle> CHFile;
typedef class THandle<HANDLE, BOOL, &FindClose> CHFind;
typedef class THandle<HANDLE, BOOL, &FindCloseChangeNotification> CHChange;
typedef class THandle<HMODULE, BOOL, &FreeLibrary> CHModule;
typedef class THandle<HWND, BOOL, &DestroyWindow> CHWnd;
//

代码见上,VC6编译的时候报
error C2440: 'specialization' : cannot convert from 'int (__stdcall *)(void *)' to ' (__stdcall *)()'
This conversion requires a reinterpret_cast, a C-style cast or function-style cast
error C2975: 'THandle' : invalid template argument for 'CloseFunc', constant expression expected see declaration of 'THandle'
.......
WHY?
...全文
468 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
船长77 2005-05-01
  • 打赏
  • 举报
回复
MSDN上面已经说过这个错误是VS的一个BUG,打SP3就可以。我打了SP5还是同样报错。然后下了个英文版的SP6,编译通过。估计是我下载的SP5存在问题。
谢谢keiy 。已给分。
船长77 2005-05-01
  • 打赏
  • 举报
回复
好了,是SP5的问题。
柯本 2005-05-01
  • 打赏
  • 举报
回复
你在命令行下试试(这样可排除设置问题),不行重打sp5或下个SP6(你的SP5没打好或不全?)
船长77 2005-05-01
  • 打赏
  • 举报
回复
我也是安装了SP5。
这个错误在MSDN上被视为VS的一个BUG。但是是说安装SP3就可以搞定,我都安装SP5了。
柯本 2005-05-01
  • 打赏
  • 举报
回复
应该与设置无关吧,我在命令行及IDE下都能通过的
我的VC已安装了sp5
装个sp5试试(microsoft网站上已有sp6了)
船长77 2005-05-01
  • 打赏
  • 举报
回复
和VC的设置有关吗?
船长77 2005-05-01
  • 打赏
  • 举报
回复
我还没定义变量。单单你上面那些我就编译不过。你的VC有安装SP3吗?
柯本 2005-05-01
  • 打赏
  • 举报
回复
把你的变量定义贴出来看看,我这样可以编译运行
#include <windows.h>
#pragma comment (lib,"advapi32")
#pragma comment (lib,"user32")


template<class T, class CloseT, CloseT (_stdcall * CloseFunc)(T)> class THandle {
T m_h;
public:
THandle() {
m_h = T(-1); // Always illegal
}
THandle(T h) { m_h = h; }
~THandle() {
if (IsValid()) Close(); // Ensure we do not double-close
}
THandle<T, CloseT, CloseFunc>& operator=(T h) {
m_h = h;
return *this;
}
operator T() { return m_h; }
T *operator &() { return &m_h; }
CloseT Close() {
T h = m_h;
m_h = T(-1);
return (*CloseFunc)(h); // Return the result of whatever type
};
BOOL IsValid() { return m_h != T(-1) && m_h != T(0); }
};
//
// Now define common handles as safe classes.
//
typedef class THandle<HANDLE, BOOL, &CloseHandle> CHandle;
typedef class THandle<HKEY, LONG, ®CloseKey> CHKey;
typedef class THandle<HANDLE, BOOL, &CloseHandle> CHFile;
typedef class THandle<HANDLE, BOOL, &FindClose> CHFind;
typedef class THandle<HANDLE, BOOL, &FindCloseChangeNotification> CHChange;
typedef class THandle<HMODULE, BOOL, &FreeLibrary> CHModule;
typedef class THandle<HWND, BOOL, &DestroyWindow> CHWnd;
//

void main()
{
CHandle hd;
hd.Close();
CHKey ke;
ke.Close();
CHFile fe;
fe.Close();
CHFind fd;
fd.Close();
CHChange ce;
ce.Close();
CHModule me;
me.Close();
CHWnd wd;
wd.Close();

}
船长77 2005-05-01
  • 打赏
  • 举报
回复
我是觉得是能够强制转换的。因为这个代码是从别人工程中拷贝的,别人能编译过。
船长77 2005-05-01
  • 打赏
  • 举报
回复
我的QQ 361017175。在线请教。
柯本 2005-05-01
  • 打赏
  • 举报
回复
我在VC6 下编译没问题啊!
cnwolf 2005-05-01
  • 打赏
  • 举报
回复
error C2440: 'specialization' : cannot convert from 'int (__stdcall *)(void *)' to ' (__stdcall *)()'

传入的函数指针不匹配, 如果不是错误的话,可以强制转换

return (*CloseFunc)(h);

h不是类的成员变量
船长77 2005-05-01
  • 打赏
  • 举报
回复
在线等。立即给分。

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧