错误 C2309:不是 CDialog 的成员
Posted
技术标签:
【中文标题】错误 C2309:不是 CDialog 的成员【英文标题】:error C2309: is not a member of CDialog 【发布时间】:2016-11-02 11:03:31 【问题描述】:我有结构:PrintChooseDlg.h
#ifndef PRINTCHOOSEDLG_H
#define PRINTCHOOSEDLG_H
#include <string>
#pragma once
#endif
class CPrintChooseDlg : public CDialog
public:
int choosing;
/*afx_msg void OnPrinter1();
afx_msg void OnPrinter2();*/
CPrintChooseDlg(CWnd* pParent = NULL);
enum IDD = IDD_PRINTBOX ;
protected:
virtual void DoDataExchange(CDataExchange* pDX);
protected:
//afx_msg void OnPrinter1();
//afx_msg void OnPrinter2();
virtual void OnPrinter1();
virtual void OnPrinter2();
DECLARE_MESSAGE_MAP()
;
和 PrintChooseDlg.cpp
// PrintChoose.cpp : implementation file
//
#include "stdafx.h"
#include "Tungsten.h"
#include "PrintChooseDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// PrintChoose
//IMPLEMENT_DYNAMIC(PrintChoose, CWnd)
CPrintChooseDlg::CPrintChooseDlg(CWnd* pParent /*=NULL*/)
: CDialog(CPrintChooseDlg::IDD, pParent)
//AFX_DATA_INIT(CChooseLabelDlg)
// NOTE: the ClassWizard will add member initialization here
//AFX_DATA_INIT
void CPrintChooseDlg::DoDataExchange(CDataExchange* pDX)
CDialog::DoDataExchange(pDX);
//AFX_DATA_MAP(CChooseLabelDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//AFX_DATA_MAP
BEGIN_MESSAGE_MAP(CPrintChooseDlg, CDialog)
ON_BN_CLICKED(IDC_PRINTER1,OnPrinter1)
ON_BN_CLICKED(IDC_PRINTER2,OnPrinter2)
END_MESSAGE_MAP()
// PrintChoose message handlers
void CPrintChooseDlg::OnPrinter1()
choosing=0;
CDialog::OnPrinter1();
void CPrintChooseDlg::OnPrinter2()
choosing=1;
CDialog::OnPrinter2();
在我运行的主文件中,我定义了以下标题:
#include "stdafx.h"
#include "Tungsten.h"
#include "TungstenDlg.h"
using namespace std;
#include<sstream>
#include <string>
问题是我总是收到以下错误:错误 C2039: 'OnPrinter1': is not a member of 'CDialog' 错误 C2039:“OnPrinter2”:不是“CDialog”的成员
我尝试在我的标题中添加#include <string>
并确保标题不重复,并在我运行的主文件中定义 Printer1 和 Pronter 2,但我仍然遇到相同的错误。我感谢您的帮助。提前致谢
【问题讨论】:
消息描述性很强,CDialog
没有OnPrinter1
的功能,所以不能调用CDialog::OnPrinter1
。
我是 C++ 的初学者。是不是 virtual void OnPrinter1();是类内部的函数吗?
它是 CPrintChooseDlg 中的函数,而不是 CDialog。打个比方,一个人知道怎么做,并不意味着他们的父母会做。
【参考方案1】:
要获取成员函数的地址,需要使用&CPrintChooseDlg::OnPrinter1
。
真正旧的 VC++,如 VC6,不关心正确的语法并生成不正确的消息映射。
【讨论】:
以上是关于错误 C2309:不是 CDialog 的成员的主要内容,如果未能解决你的问题,请参考以下文章
C++ MFC - 在 CDialog::OnSize 事件 (GetWindowRect) 上没有引发运行时错误的代码执行失败
qt 错误 多继承 造成错误 “qt_metacast”: 不是“****”的成员