#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{}
orT()
?4. Ошибка заключается в отсутствии подходящего конструктора по умолчанию. Я бы предположил, что это из-за зависимости от (wxWindow * parent). Итак, если я получу правильный формат в T (), возможно, со вторым типом шаблона это должно сработать.
5. Да, если
T
по умолчанию не может быть сконструирован, тогда вам нужно будет указать параметры в части{}
/()
.