首页 > 解决方案 > 在 wxWidgets 中使用模板类作为 bind() 的输入

问题描述

我有一组 wxPanel,用于笔记本的页面,用于 C++ 中的 GUI。它们都有不同的数据,但一组通用的设置功能是读取数据。我设计了一个帮助类(我的措辞)来容纳所有常用功能,因此每个面板或框架不需要剪切和粘贴基本相同的代码。辅助类是模板化的,并从 GUI 面板类内部调用,以便类可以使用这些功能。除了一项,wxWidgets 中的 bind(event, method, handler) 函数外,一切似乎都可以正常工作。这需要使用 MyHelperClass 中的构建 GUI 函数将 MyPanel 中的方法绑定到 MyPanel 中的按钮。我以前从未发布过代码,所以请原谅格式,但这里是基本函数/类的精简版本。

template<class T>
class MyHelperClass {

public:

    typedef void (T::*buttonPush)(wxCommandEvent & event);  //  This typedef seems to work 

    void makeSomeGUIpanels(pl, &pb, buttonPush f, &pp, *p);

private:

};


template<class T>
void MyHelperClass<T>::makeSomeGUIpanels(pl, &pb, buttonPush f, &pp, *p) {

    //  Do some stuff to set up the panels, buttons and labels.
    ...
    ...


    //  Bind each button to the input function.

    //  **** HERE IS THE PROBLEM.  ****  
    pb[0]->Bind(wxEVT_BUTTON, f, T);

    //  Put each panel together.
    enterBox->Add(pb[0]);
    pp[0]->SetSizer(enterBox);

}

我删掉了很多我认为与问题无关的代码,并删除了函数接口中的类型。例如在使用前在函数中定义了enterBox。该功能的使用发生在创建的每个面板版本中。一个例子是...

class MyPanel : public wxPanel
{
public:
    MyPanel(wxWindow *parent);

private:

    MyHelperClass<MyPanel> cpf;

    //  More stuff ...
}

cpf 中的方法在此面板的方法中调用以构建 GUI。

void MyPanel::SomeFunction(){
    cpf.makeSomeGUIpanel(...);
}

将 T 放在绑定函数中会导致编译错误“T”:非法将此类型用作表达式。我尝试使用我在堆栈溢出中发现的其他方法将模板传递给函数,但没有一个有效。其他一切都有效,所以我认为我的模板使用并不可怕。我以前使用过模板,但从来没有这样的事情。我不确定问题是模板语法,它可能是 bind() 的 wxWidgets 问题。方法 f 需要属于处理程序,在本例中为 T,我认为编译器需要能够检查这一点,也许它不能。请注意,我在类中创建的 typedef 似乎在编译或运行注释掉的 bind 命令时不会出错。

我感谢任何帮助或见解。提前致谢。

标签: c++templateswxwidgets

解决方案


推荐阅读