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, &RegCloseKey> 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?

解决方案 »

  1.   

    error C2440: 'specialization' : cannot convert from 'int (__stdcall *)(void *)' to ' (__stdcall *)()'传入的函数指针不匹配, 如果不是错误的话,可以强制转换return (*CloseFunc)(h);h不是类的成员变量
      

  2.   

    把你的变量定义贴出来看看,我这样可以编译运行
    #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, &RegCloseKey> 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();}
      

  3.   

    我还没定义变量。单单你上面那些我就编译不过。你的VC有安装SP3吗?
      

  4.   

    应该与设置无关吧,我在命令行及IDE下都能通过的
    我的VC已安装了sp5
    装个sp5试试(microsoft网站上已有sp6了)
      

  5.   

    我也是安装了SP5。
    这个错误在MSDN上被视为VS的一个BUG。但是是说安装SP3就可以搞定,我都安装SP5了。
      

  6.   

    你在命令行下试试(这样可排除设置问题),不行重打sp5或下个SP6(你的SP5没打好或不全?)
      

  7.   

    MSDN上面已经说过这个错误是VS的一个BUG,打SP3就可以。我打了SP5还是同样报错。然后下了个英文版的SP6,编译通过。估计是我下载的SP5存在问题。
    谢谢keiy 。已给分。