У меня есть набор 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.
Я ценю любую помощь или понимание. Заранее спасибо.