错误 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 &lt;string&gt; 并确保标题不重复,并在我运行的主文件中定义 Printer1 和 Pronter 2,但我仍然遇到相同的错误。我感谢您的帮助。提前致谢

【问题讨论】:

消息描述性很强,CDialog没有OnPrinter1的功能,所以不能调用CDialog::OnPrinter1 我是 C++ 的初学者。是不是 virtual void OnPrinter1();是类内部的函数吗? 它是 CPrintChooseDlg 中的函数,而不是 CDialog。打个比方,一个人知道怎么做,并不意味着他们的父母会做。 【参考方案1】:

要获取成员函数的地址,需要使用&amp;CPrintChooseDlg::OnPrinter1

真正旧的 VC++,如 VC6,不关心正确的语法并生成不正确的消息映射。

【讨论】:

以上是关于错误 C2309:不是 CDialog 的成员的主要内容,如果未能解决你的问题,请参考以下文章

C++ MFC - 在 CDialog::OnSize 事件 (GetWindowRect) 上没有引发运行时错误的代码执行失败

错误 C2039:“查找”:不是“标准”的成员

qt 错误 多继承 造成错误 “qt_metacast”: 不是“****”的成员

编译时间错误C4407

未捕获的 Promise 错误:TypeError:成员不是函数

Class`成员不知何故不情愿地改变