更新:
This was a bug in wxWidgetsこれは、C++ 11互換のコンパイラを使用している場合、wxWidgets 3.1.1で修正されています。基本クラスが保護されている場合、派生クラスのアクセスはアクセス不可能
イベントハンドラを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で次のエラーをネットアップデート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
保護された継承がなぜあなたのために機能すると思いますか?それはできません。 C++のOOフレームワークは公開継承に依存しています。 –
@Barry Bindは、指定されたイベント(この場合はSIZING)が実行されるたびに、呼び出されるメソッドをバインドするメソッドです。詳細については、http://docs.wxwidgets.org/trunk/overview_events.html#overview_events_bindを参照してください。 – tambre