vc6的程序在vc2003运行;
出现以下错误:
error C2259: 'CException' : cannot instantiate abstract class所对应的程序行是:
 throw new CException;
请教大虾,应该怎么修改?另外还有这个错误:
error C2316: 'CException &' : cannot be caught as the destructor and/or copy constructor are inaccessible
将程序行  catch(CException& e)
改为
          catch(CException* e)  
没有错误,这样改应该没问题吧?

解决方案 »

  1.   

    这是CException在VC2003中的定义
    class AFX_NOVTABLE CException : public CObject
    {
    // abstract class for dynamic type checking
    DECLARE_DYNAMIC(CException)public:
    // Constructors
    CException();   // sets m_bAutoDelete = TRUE
    explicit CException(BOOL bAutoDelete);   // sets m_bAutoDelete = bAutoDelete// Operations
    void Delete();  // use to delete exception in 'catch' block virtual BOOL GetErrorMessage(LPTSTR lpszError, UINT nMaxError,
    PUINT pnHelpContext = NULL);
    virtual int ReportError(UINT nType = MB_OK, UINT nMessageID = 0);// Implementation (setting m_bAutoDelete to FALSE is advanced)
    public:
    virtual ~CException() = 0;
    BOOL m_bAutoDelete;
    #ifdef _DEBUG
    void PASCAL operator delete(void* pbData);
    #if _MSC_VER >= 1200
    void PASCAL operator delete(void* pbData, LPCSTR lpszFileName, int nLine);
    #endif
    protected:
    BOOL m_bReadyForDelete;
    #endif
    };显然它是一个虚类,不能实例化的。catch对应于throw new,应该是catch指针,如果是throw T,则用catch(T&)
      

  2.   

    CException在VS2003/2005中改为抽象类,只能用以下的类来抛出异常
    http://msdn2.microsoft.com/en-us/library/yx1b5f5w.aspx或创建自己的异常类
      

  3.   

    谢谢各位大虾。本人菜鸟一个。请问throw T指的是什么?
    还有如果用http://msdn2.microsoft.com/en-us/library/yx1b5f5w.aspx的类,各个类的区别是否很大?如何选择?
    如果创建自己的异常类,是否是从CException继承?这个类放在哪个文件里呢?还是新建个cpp文件和头文件?
    能否给个实例?或者查找哪一类的资料?
    问这么多问题,还请大虾们耐心回答。谢谢!
      

  4.   

    you can use CUserException directly. See the source code of CWnd::UpdateData() for more information.