Обновление:
This was a bug in wxWidgets. Это было исправлено в wxWidgets 3.1.1, если вы используете компилятор, совместимый с C++ 11.Преобразование в производном классе недоступно, если базовый класс защищен
Я пытаюсь динамически привязывать обработчик события к событию в wxWidgets. К сожалению, если производный класс защищен, он, похоже, не работает.
Минимальный пример:
// Test.h
class Test : protected wxFrame
{
public:
Test();
private:
void sizing(wxSizeEvent& event);
};
// Test.cpp
Test::Test()
{
Bind(wxEVT_SIZING, &Test::sizing, this);
}
void Test::sizing(wxSizeEvent& event)
{
}
Это, к сожалению, не похоже на работу и сетей следующее сообщение об ошибке на Visual Studio 2015 Update 3:
wxWidgets\include\wx/meta/convertible.h(31): error C2243: 'type cast': conversion from 'Test *' to 'wxEvtHandler *' exists, but is inaccessible
wxWidgets\include\wx/event.h(335): note: see reference to class template instantiation 'wxConvertibleTo<Class,wxEvtHandler>' being compiled
with
[
Class=Test
]
wxWidgets\include\wx/event.h(3568): note: see reference to class template instantiation 'wxEventFunctorMethod<EventTag,Test,EventArg,EventHandler>' being compiled
with
[
EventTag=wxEventTypeTag<wxSizeEvent>,
EventArg=wxSizeEvent,
EventHandler=Test
]
Test.cpp(78): note: see reference to function template instantiation 'void wxEvtHandler::Bind<wxEventTypeTag<wxSizeEvent>,Test,wxSizeEvent,Test>(const EventTag &,void (__cdecl Test::*)(EventArg &),EventHandler *,int,int,wxObject *)' being compiled
with
[
EventTag=wxEventTypeTag<wxSizeEvent>,
EventArg=wxSizeEvent,
EventHandler=Test
]
Изменение наследования для общественности делает его работу:
class Test : public wxFrame
- Почему преобразование недоступно, когда наследование защищено?
- Я не хочу раскрывать wxFrame миру, а только классы, которые производят класс Test. Как я могу это сделать, все еще имея возможность динамически связывать обработчик событий?
Что такое 'Bind()'? – Barry
Почему вы ожидаете, что защищенное наследование будет работать на вас? Это не так. Структуры OO в C++ полагаются на публичное наследование. –
@Barry Bind - метод, который привязывает данный метод к вызову всякий раз, когда выполняется данное событие (в данном случае SIZING). Дополнительную информацию см. В http://docs.wxwidgets.org/trunk/overview_events.html#overview_events_bind. – tambre