CRTPテンプレートのメンバポインタに問題があります。 このコードは、crtp派生クラスのメンバ関数ポインタを呼び出す仮想呼び出し関数です。派生クラスのメンバ関数ポインタ
class KeyboardHandler {
public:
virtual void keyPressed(KeyboardKey) = 0;
virtual void keyReleased(KeyboardKey) = 0;
KeyboardHandler & operator=(const KeyboardHandler &) = default ;
};
template<class T>
class KeyboardHandlerOpti : public KeyboardHandler {
public:
using KeyboardCallback = void (T::*)(KeyboardKey key, KeyboardStatus status) ;
KeyboardHandlerOpti(KeyboardCallback defaultCallback);
virtual void keyPressed(KeyboardKey key) override final;
virtual void keyReleased(KeyboardKey key) override final ;
std::vector<KeyboardCallback> mCallbackPressed ;
std::vector<KeyboardCallback> mCallbackReleased ;
KeyboardHandlerOpti & operator=(const KeyboardHandlerOpti &) = default ;
private:
KeyboardCallback mDefaultCallback ;
};
class GlfwDefaultKeyboardHandler :
public KeyboardHandlerOpti<GlfwDefaultKeyboardHandler> {
public:
GlfwDefaultKeyboardHandler() ;
GlfwDefaultKeyboardHandler & operator=(const GlfwDefaultKeyboardHandler &) = default ;
private:
//This is type of KeyboardCallback
void drawKey(KeyboardKey key, KeyboardStatus status) ;
} ;
クラスGlfwDefaultKeyboardHandlerがKeyboardHandlerOptiとしてdrawKeyで初期化されます:: mDefaultCallback
template<class T>
KeyboardHandlerOpti<T>::KeyboardHandlerOpti(KeyboardCallback defaultCallback) :
mDefaultCallback(defaultCallback),
mCallbackPressed(getKeyboardKeyCount(), mDefaultCallback),
mCallbackReleased(getKeyboardKeyCount(), mDefaultCallback) {
}
とコールバックは
template<class T>
void KeyboardHandlerOpti<T>::keyPressed(KeyboardKey key) {
KeyboardCallback c = mCallbackPressed[getKeyValue(key)] ;
(dynamic_cast<T *>(this)->*c)(key, KeyboardStatus::ePressed) ;
//(this->*c)(key, KeyboardStatus::ePressed) ;
}
と呼ばれている残念ながら、私はセグメンテーションフォルトを持っていると私はすることはできませんよ理由を理解する。私はデバッグで興味深い値を見つけました。 KeyboardHandlerOptiの構築時に、私が実際に理解していないことがあることがわかります。
defaultCallbackの値は0x4b7578で、デバッガは関数の名前を知ることができますが、mDefaultCallbackは "0x7ef360、この調整96"であり、両方のベクトルで同じ値です。
誰かが私に説明することができれば、どうして私はセグメンテーションを持つのですか?私はとても幸せになるでしょう。
本当にありがとうございます.GMMは警告を表示していませんでした。 –