2016-07-22 3 views
0

私は、図のように異なるキーボードレイアウトを使用しているため、vitual Keyboardクラスを実装しようとしています。LNK 2001:静的メンバーの初期化中に未解決の外部シンボル

KeyBoard.hpp

class CKeyBoard 
{ 
    public: 

    enum eKeyBoardLayout 
    { 
     UPPER_CASE_ALPHABETS, 
     LOWER_CASE_ALPHABETS, 
     UPPER_CASE_NUMBERS, 
     LOWER_CASE_NUMBERS, 
     MAX_KEYBOARDLAYOUTS, 
    }; 
    CKeyBoard(); 
    void hideCharacters(bool hide); // for password 
    void setDisplayBufferLength(UNSIGNED8_T maxCharToDisplay); 
    virtual ~CKeyBoard(); 
    static const UNSIGNED8_T const_noOfRows = 0x03; // 3 rows for character keys 
    struct SLayout 
    { 
     UNSIGNED8_T noOfColumns[const_noOfRows]; ///< noofcolumns in each row may be different 
     TypedText  textAreaFont; 
     const KeyMapping* pKeyMapping; 
    }; 
    static const SLayout m_KeyBoardLayouts[MAX_KEYBOARDLAYOUTS]; 
private: 
    /*methods*/ 
    void setKeyBoardLayout(eKeyBoardLayout); 
    void backspacePressedHndlr(); 
    void letterCasePressedHndlr(); 
    void alphabetNumberToggleHndlr(); 
    /*members*/ 
    static const UNSIGNED8_T const_maxNoOfKeysSupprtd = 26; 
    CKey m_keyArray[const_maxNoOfKeysSupprtd]; 
    CMenuItem m_KeySpaceBar; 
    CMenuToggle m_KeyCaseSwitch; 
    CMenuToggle m_KeyAlphaNum; 
    CMenuItem m_keyBackSpace; 
    eKeyBoardLayout m_eCurrentKeyLayout; 
    CKeyBoardDisplayArea m_DisplayArea; 

}。

私は静的メンバーをcppファイルで次のように初期化しています。 KeyBoard.cpp

static const CKeyBoard::SLayout m_KeyBoardLayouts[CKeyBoard::MAX_KEYBOARDLAYOUTS] = \ 
    { 
     //  UPPER_CASE_ALPHABETS, 
    { 
     { 10, 9, 7 }, 
     TypedText(T_KEYBOARD), 
     &keyMappingsAlphaUpper[0], 

}, 
//  LOWER_CASE_ALPHABETS, 
{ 
    { 10, 9, 7 }, 
    TypedText(T_KEYBOARD), 
    &keyMappingsAlphaLower[0], 
}, 
//  UPPER_CASE_NUMBERS, 
{ 
    { 10, 10, 5 }, 
    TypedText(T_KEYBOARD), 
    &keyMappingsNumLower[0], 
}, 
//  LOWER_CASE_NUMBERS, 
{ 
    { 10, 10, 5 }, 
    TypedText(T_KEYBOARD), 
    &keyMappingsNumLower[0] 
}, 


}; 
// Other function definitions 
CKey::CKey() : m_pCallback(NULL) 
{ 
} 

しかし、それでもまだ、私はリンカエラーとして未解決の外部シンボルを取得しています。 ここで何が間違っていますか?

エラーの詳細: * エラーLNK2001:未解決の外部シンボル "パブリック:静的構造体CKeyBoard :: SLayoutのCONST * constのCKeyBoard :: m_KeyBoardLayouts"(B @ m_KeyBoardLayouts @ CKeyBoard @@ 2QBUSLayout @ 1?) *

答えて

2

あなたは、クラススコープを追加するのを忘れ:

static const CKeyBoard::SLayout 
    CKeyBoard::m_KeyBoardLayouts[CKeyBoard::MAX_KEYBOARDLAYOUTS] 

それは実際にコンパイラはそのような静的なリンケージを警告しません残念だ...それはよくある間違いです。

+0

ああ..それを指摘してくれてありがとう。 しかし、私が編集したときに、別の奇妙なエラーが発生しました。 エラーC2720: 'CKeyBoard :: m_KeyBoardLayouts':メンバで 'static'ストレージクラス指定子が不正です\t keyboard.cpp \t そして、次のように初期化して解決しました。 CKeyBoard :: SLayout const CKeyBoard :: m_KeyBoardLayouts [CKeyBoard :: MAX_KEYBOARDLAYOUTS] – kernel

+0

なぜこれが起こっていますか? (私が行った初期化が間違っていることを認識しています) – kernel

+0

これはC++です:)。あなたはそれを '静的'と宣言しますが、シンボルを定義するだけです。 (あなたはあなたの定義の前に 'public'を追加しませんか?ここで読む:http://en.cppreference.com/w/cpp/language/static – xtofl

関連する問題