可视化解决VS 2003中指向成员错误的c++指针

visual Resolve c++ pointer-to-member error in VS 2003

本文关键字:错误 成员 c++ 指针 解决 VS 2003 可视化      更新时间:2023-10-16

我有一个c++程序,我正试图将它从VS98移植到VS2003(增量步骤)。贯穿始终的一个错误是"错误2275"

例如:k:\RR\chart\chartdlg.cpp(2025):错误C2475:"CRrDoc::cFldFilter":形成指向成员的指针需要显式使用运算符("&")的地址和限定名

违规代码如下所示:

void CDataPage::OnBtnLabelField()
{
    FLDID       fid ;
    LPMFFIELD   f ;
    CRrApp  *pApp = (CRrApp *)AfxGetApp();
    CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
    CRrDoc  *pDoc = (CRrDoc *)pFrame->GetActiveDocument();
    CSelectFieldDlg dlg;
    //**************************************************
    //BOOL CRrDoc::*zcFldFilter = &CRrDoc::cFldFilter;
    //dlg.ck = CRrDoc->*zcFldFilter;
    //**************************************************
    dlg.ck = pDoc->cFldFilter ;
    dlg.TitleTextID = IDS_2676;
    fid = (FLDID)dlg.DoModal();
    if (fid != NOID)
    {
        f = pDoc->m_pComposite->mfbyndx(fid);
        // find index
        int i, iCount;
        iCount = m_lboxLabel.GetCount();
        for (i = 0; i < iCount; i++)
        {
            if(fid == m_lboxLabel.GetItemData(i))
            {
                m_lboxLabel.SetCurSel(i);
                OnSelchangeComboLabel();
            }
        }
    }
}

我试着根据微软的一个页面来处理它:但这只是产生了一系列其他问题(星号之间的注释代码)。请注意,我还注释了以下行:

dlg.ck = pDoc->cFldFilter

不幸的是,这导致了一个新的错误:k:\RR\chart\chartdlg.cpp(2022):错误C2440:"初始化":无法从"BOOL(__cdecl)(LPMFFIELD)"转换为"BOOL CRrDoc::"

H.文件中的定义如下:

public:
        static BOOL cFldFilter(LPMFFIELD f);

有什么想法如何处理指向成员的指针问题吗?

因为您有:

static BOOL CRrDoc::cFldFilter(LPMFFIELD f);

它的类型不是成员变量,而是一个函数:

//BOOL CRrDoc::*zcFldFilter = &CRrDoc::cFldFilter;    // doesn't work
BOOL (*zcFldFilter)(LPMFFIELD) = &CRrDoc::cFldFilter; // works

由于dlg.ck是正确的类型,您应该执行

dlg.ck = &CRrDoc::cFldFilter;