获得'未声明的标识符'错误

时间:2010-10-25 08:00:00

标签: c++ function-declaration undeclared-identifier

按照http://www.codersource.net/mfc/mfc-tutorials/ctabctrl.aspx的教程,我在头文件中声明了函数ActivateTabDialogs(),并在我的类中的另一个函数内调用它。编译器在函数C2065: 'ActivateTabDialogs' : undeclared identifier的定义内的行ActivateTabDialogs();处给出错误OnSelChange()。我在这里违反了什么?

这是头文件TCGeriArama_TabCtrl.h

中的声明部分
class CTCGeriArama_TabCtrl : public CTabCtrl
{
// Construction
public:
    CTCGeriArama_TabCtrl();

// Attributes

    //Array to hold the list of dialog boxes/tab pages for CTabCtrl
    int m_DialogID[2];

    int m_nPageCount;

    //CDialog Array Variable to hold the dialogs 
    CDialog *m_Dialog[2];

public:
// Operations
    //Function to Create the dialog boxes during startup
    void InitDialogs();

    //Function to activate the tab dialog boxes
    void ActivateTabDialogs();

以下是ActivateTabDialogs()的定义以及我在TCGeriArama_TabCtrl.cpp内调用它的部分

void CTCGeriArama_TabCtrl::ActivateTabDialogs()
{
    int nSel = GetCurSel();
    if(m_Dialog[nSel]->m_hWnd)
        m_Dialog[nSel]->ShowWindow(SW_HIDE);

    CRect l_rectClient;
    CRect l_rectWnd;

    GetClientRect(l_rectClient);
    AdjustRect(FALSE,l_rectClient);
    GetWindowRect(l_rectWnd);
    GetParent()->ScreenToClient(l_rectWnd);
    l_rectClient.OffsetRect(l_rectWnd.left,l_rectWnd.top);
    for(int nCount=0; nCount < m_nPageCount; nCount++){
        m_Dialog[nCount]->SetWindowPos(&wndTop, l_rectClient.left, l_rectClient.top, l_rectClient.Width(), l_rectClient.Height(), SWP_HIDEWINDOW);
    }
    m_Dialog[nSel]->SetWindowPos(&wndTop, l_rectClient.left, l_rectClient.top, l_rectClient.Width(), l_rectClient.Height(), SWP_SHOWWINDOW);

    m_Dialog[nSel]->ShowWindow(SW_SHOW);

}

//Selection change event for the class derived from CTabCtrl
void OnSelchange(NMHDR* pNMHDR, LRESULT* pResult)
{
    // TODO: Add your control notification handler code here
    ActivateTabDialogs(); // HERE'S WHERE THE COMPILER GIVES THE ERROR
    *pResult = 0;
}

感谢。

3 个答案:

答案 0 :(得分:2)

显然OnSelChange是免费功能。 ActiveTabDialogs是类CTCGeriArama_TabCtrl的成员函数。必须在它们所属的类的实例上调用成员函数。有两种选择:

  1. 使OnSelChange也成为CTCGeriArama_TabCtrl的成员函数。
  2. 将来电更改为someObj.ActiveTabDialogs(),并为OnSelChange提供CTCGeriArama_TabCtrl - 实例的引用。
  3. 从它的外观来看OnSelChange是一个回调函数。它可能很难使它成为一个成员函数,因为它会改变它的指针类型。如果这是您正在使用的某个框架的回调,则应检查该框架是否提供了一些机制来将上下文信息传递给回调处理程序(可能是NMHDR* pNMHDR - 参数的用途)。

答案 1 :(得分:1)

在您提供的链接中,函数OnSelchange是一个成员函数。

所以尝试改变

void OnSelchange(NMHDR* pNMHDR, LRESULT* pResult)

为:

void CTCGeriArama_TabCtrl::OnSelchange(NMHDR* pNMHDR, LRESULT* pResult) 

答案 2 :(得分:0)

事实证明我没有使用类向导添加处理程序,并手动放置函数OnSelChange(),这导致了问题。非常感谢您的关注