wxwidgets Bind()项的计算结果不是在event.h中使用1个参数的函数

wxwidgets Bind() term does not evaluate to a function taking 1 argument in event.h

本文关键字:event 函数 参数 1个 Bind 计算 结果 wxwidgets      更新时间:2023-10-16

我得到了以下错误,我不知道错误实际上想告诉我什么。

error C2064: term does not evaluate to a function taking 1 arguments event.h line 516

这当然是wxwidgets事件.h文件

导致错误的代码是此方法中的Bind()。

int Layout::CreateWindow()
{
    wxPanel * m_pPanel = new wxPanel(this, -1);
    wxBoxSizer * m_pVbox = new wxBoxSizer(wxVERTICAL);
    wxTextCtrl * m_pReceiveBox = new wxTextCtrl(m_pPanel, wxID_ANY,    wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE | wxTE_READONLY);
    wxTextCtrl * m_pSendBox = new wxTextCtrl(m_pPanel, ID_SEND, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER);
    wxStatusBar * m_pStatusBar = new wxStatusBar(m_pPanel, wxID_ANY, wxSTB_DEFAULT_STYLE);
    m_pVbox->Add(m_pReceiveBox, 1, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 2);
    m_pVbox->Add(m_pSendBox, 0, wxEXPAND | wxLEFT | wxRIGHT, 2);
    m_pVbox->Add(m_pStatusBar, 0, wxEXPAND);
    m_pPanel->SetSizer(m_pVbox);
    Bind(wxEVT_TEXT_ENTER, &Layout::OnSendEnter, ID_SEND);
    return 0;
}
enum ID
{
    ID_SEND             =   wxID_HIGHEST+1,
    ID_MENU_CONNECT,
    ID_MENU_DISCONNECT
};

我有一种感觉,我使用了错误的重载函数,但如果我尝试将Bind()更改为

Bind(wxEVT_TEXT_ENTER, &Layout::OnSendEnter, this, ID_SEND);

我得到一个intellisense错误:没有重载函数的实例"Layout::Bind与参数列表匹配。我相信这对那些更熟悉的人来说可能是显而易见的,所以请解释我对的误解

更新:Layout.h

class Layout : public wxFrame
{
public:
    // Constructor
    Layout(const wxString & title);
    // Event Methods - ** possibly private ***
    void OnConnect(wxCommandEvent & event);
    void OnDisconnect(wxCommandEvent & event);
    void OnQuit(wxCommandEvent & event);
    int OnSendEnter(wxCommandEvent & event);
    // Helper methods - ** possibly private **
    int CreateMenu();
    int CreateWindow();
    // Class members
    wxMenuBar * m_pMenubar;
    wxMenu * m_pFileMenu;
    wxMenu * m_pHelpMenu;
    wxMenu * m_pPortMenu;
};

对于非静态成员函数,问题中提到的Bind的第二个重载确实是要调用的重载(第一个重载用于自由函数、静态成员函数或函数对象)。

然而,Bind过载的第二个参数声明如下:

void (Class::*method)(EventArg &)

ClassEventArg是模板参数)。

注意void——这是您的情况中不匹配的地方,因为您的成员函数被声明为返回int


附带说明一下,您可以直接将Bind发送到您感兴趣的小部件,如下所示:

m_pSendBox->Bind(wxEVT_TEXT_ENTER, &Layout::OnSendEnter, this);

如果事件处理是使用ID_SEND的唯一原因,则无需定义自定义ID。