「宣言されていない識別子」エラーが発生する
-
26-09-2019 - |
質問
次のチュートリアルに従ってください 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
私は、クラスウィザードを使用してハンドラを追加し、手動で関数OnSelChange()
を入れて、それが問題を引き起こしていたなかったことが判明します。おかげでたくさんのあなたの注意のための
他のヒント
まあ、どうやら OnSelChange
は無料の機能です。 ActiveTabDialogs
クラスのメンバー関数です CTCGeriArama_TabCtrl
. 。メンバー関数は、そのメンバーであるクラスのインスタンス上で呼び出す必要があります。次の 2 つのオプションがあります。
- 作る
OnSelChange
のメンバー関数CTCGeriArama_TabCtrl
あまりにも。 - 通話を次のように変更します
someObj.ActiveTabDialogs()
そして提供しますOnSelChange
を参照してCTCGeriArama_TabCtrl
-実例。
見た目からして OnSelChange
はコールバック関数です。ポインター型が変わるため、メンバー関数にするのはおそらく難しいでしょう。これが使用しているフレームワークのコールバックである場合は、そのフレームワークがコンテキスト情報をコールバック ハンドラーに渡す何らかのメカニズムを提供しているかどうかを確認する必要があります (おそらく、 NMHDR* pNMHDR
-パラメータは対象です)。
あなたによって与えられたリンクでは、関数OnSelchange
は、メンバ関数です。
だから、変更してみてください。
void OnSelchange(NMHDR* pNMHDR, LRESULT* pResult)
と
void CTCGeriArama_TabCtrl::OnSelchange(NMHDR* pNMHDR, LRESULT* pResult)