Использование шаблонного класса в качестве входных данных для bind () в wxWidgets - PullRequest
0 голосов
/ 06 марта 2019

У меня есть набор wxPanels, страниц для записной книжки, для графического интерфейса в C ++. Все они имеют разные данные, но общий набор функций для настройки - это чтение данных. Я разработал вспомогательный класс (мою формулировку) для размещения всех общих функций, чтобы каждая панель или кадр не нуждались в вырезке и вставке практически идентичного кода. Вспомогательный класс шаблонизируется и вызывается изнутри класса панели GUI, чтобы класс мог использовать эти функции. Кажется, что все работает, за исключением одного элемента, функции связывания (событие, метод, обработчик) в wxWidgets. Это необходимо для привязки метода в MyPanel к кнопке в MyPanel с использованием функций графического интерфейса сборки в MyHelperClass. Я никогда раньше не публиковал код, так что извините за форматирование, но вот урезанная версия основных функций / классов.

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 определяется в функции перед использованием. Использование этой функции происходит в каждой созданной версии Panel. Примером является ...

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

private:

    MyHelperClass<MyPanel> cpf;

    //  More stuff ...
}

Методы в cpf вызываются в методах этой панели для построения GUI.

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

Помещение T в функцию bind вызывает ошибку компиляции 'T': недопустимое использование этого типа в качестве выражения. Я пытался использовать другие подходы, которые я нашел при переполнении стека, для передачи шаблона в функцию, но ни один из них не сработал. Все остальное работает, так что я думаю, что мое использование шаблона не ужасно. Я использовал шаблоны раньше, но никогда не делал ничего подобного. Я не уверен, что проблема заключается в синтаксисе шаблона, это может быть проблема wxWidgets с bind (). Метод, f, должен принадлежать обработчику, в данном случае T, и я думаю, что компилятор должен иметь возможность проверить это и, возможно, он не может. Обратите внимание, что typedef, который я создал в классе, похоже, работает в том смысле, что он не выдает ошибку при компиляции или запуске с закомментированной командой bind.

Я ценю любую помощь или понимание. Заранее спасибо.

...