【问题标题】:LNK 2001 : unresolved external symbol while initializing static memberLNK 2001:初始化静态成员时未解析的外部符号
【发布时间】:2016-07-22 05:18:58
【问题描述】:

我正在尝试实现一个虚拟键盘类,因为我有不同的键盘布局,如图所示。

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 文件中初始化静态成员如下。 键盘.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”(?m_KeyBoardLayouts@CKeyBoard@@2QBUSLayout@1@B) *

【问题讨论】:

    标签: c++ visual-studio


    【解决方案1】:

    您忘记添加类范围:

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

    实际上很遗憾编译器没有警告这样的静态链接......这是一个常见的错误。

    【讨论】:

    • 哦.. 感谢您指出这一点.. 但是当我进行编辑时,弹出另一个奇怪的错误。错误 C2720: 'CKeyBoard::m_KeyBoardLayouts' : 'static' 存储类说明符在成员 keyboard.cpp 上是非法的,并通过如下初始化解决。 CKeyBoard::SLayout const CKeyBoard::m_KeyBoardLayouts[CKeyBoard::MAX_KEYBOARDLAYOUTS]
    • 为什么会这样? (我知道我所做的初始化是错误的)
    • 那是 C++ :)。你声明static,但你只是定义符号。 (您不会在定义之前添加public,对吗?在此处阅读:en.cppreference.com/w/cpp/language/static
    猜你喜欢
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 2017-10-06
    • 2020-04-02
    • 2013-05-02
    • 2016-06-02
    相关资源
    最近更新 更多