Использование шаблонного класса в качестве входных данных для bind () в wxWidgets

#c #templates #wxwidgets

#c #шаблоны #wxwidgets

Вопрос:

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

 template<class T>
class MyHelperClass {

public:

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

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

private:

};


template<class T>
void MyHelperClass<T>::makeSomeGUIpanels(pl, amp;pb, buttonPush f, amp;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 вызываются в методах этой панели для построения графического интерфейса пользователя.

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

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

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

Комментарии:

1. Голосование за закрытие из-за опечатки. T это тип, а не объект. Вам нужно T{} или T() передать объект типа T .

2. Что ж, тогда мне нужна помощь с этим. Я действительно попробовал то, что вы предлагаете, и не лучше. Почему это сработало во всех других экземплярах?

3. Что происходит при использовании T{} or T() ?

4. Ошибка заключается в отсутствии подходящего конструктора по умолчанию. Я бы предположил, что это из-за зависимости от (wxWindow * parent). Итак, если я получу правильный формат в T (), возможно, со вторым типом шаблона это должно сработать.

5. Да, если T по умолчанию не может быть сконструирован, тогда вам нужно будет указать параметры в части {} / () .