• Qt 编译错误:C2228: “.key”的左边必须有类/结构/联合


    目录

    一、产生原因

    二、解决方案

    方案1:静态函数访问静态变量

    方案2:静态函数内定义对象,再访问变量


    一、产生原因

    原因:静态函数访问了非静态变量, static函数与非static变量混用,示例代码如下

    1. class FLOWEDITORSHARED_EXPORT NETranslator
    2. {
    3. public:
    4. NETranslator();
    5. static QString ch2En(const QString &ch);
    6. static QString en2Ch(const QString &en);
    7. private:
    8. QHash m_hash;
    9. };
    10. //
    11. NETranslator::NETranslator()
    12. {
    13. m_hash.insert("image", QStringLiteral("图像数据"));
    14. m_hash.insert("region", QStringLiteral("区域数据"));
    15. m_hash.insert("contours", QStringLiteral("轮廓数据"));
    16. }
    17. QString NETranslator::ch2En(const QString &ch)
    18. {
    19. QString en = m_hash.key(ch, ch);
    20. return en;
    21. }
    22. QString NETranslator::en2Ch(const QString &en)
    23. {
    24. QString ch = m_hash.value(en, en);
    25. return ch;
    26. }

    上述代码编译将会出现以下错误:

    NETranslator.cpp:12: error: C2228: “.key”的左边必须有类/结构/联合

    NETranslator.cpp:18: error: C2228: “.value”的左边必须有类/结构/联合

    二、解决方案

    方案1:静态函数访问静态变量

    那么把类变量也声明为static是否有用了,修改代码如下:

    1. class FLOWEDITORSHARED_EXPORT NETranslator
    2. {
    3. public:
    4. NETranslator();
    5. static QString ch2En(const QString &ch);
    6. static QString en2Ch(const QString &en);
    7. private:
    8. static QHash m_hash; //修改了此处,静态声明
    9. };

    再次编译出现了以下错误

    NETranslator.obj👎 error: LNK2019: 无法解析的外部符号 "public: static class QHash NETranslator::m_hash" (?m_hash@NETranslator@@2V?$QHash@VQString@@V1@@@A),该符号在函数 "public: __cdecl NETranslator::NETranslator(void)" (??0NETranslator@@QEAA@XZ) 中被引用

    无法解析的外部符号大部分原因是只做了声明,没有定义。类的静态成员必须在类内声明,在类外初始化。修改代码如下:

    1. class FLOWEDITORSHARED_EXPORT NETranslator
    2. {
    3. public:
    4. NETranslator();
    5. static QString ch2En(const QString &ch);
    6. static QString en2Ch(const QString &en);
    7. private:
    8. static QHash m_hash; //修改了此处,静态声明
    9. };
    10. //
    11. QHash NETranslator::m_hash; //修改了此处,定义
    12. NETranslator::NETranslator()
    13. {
    14. m_hash.insert("image", QStringLiteral("图像数据"));
    15. m_hash.insert("region", QStringLiteral("区域数据"));
    16. m_hash.insert("contours", QStringLiteral("轮廓数据"));
    17. }
    18. QString NETranslator::ch2En(const QString &ch)
    19. {
    20. QString en = m_hash.key(ch, ch);
    21. return en;
    22. }
    23. QString NETranslator::en2Ch(const QString &en)
    24. {
    25. QString ch = m_hash.value(en, en);
    26. return ch;
    27. }

    声明也有了,定义也有了,编译通过。上述方案m_hash虽然插入了值,但是函数中访问的m_hash数据为空。

    原因:使用NETranslator::ch2En() 方式去调用,并没有调用NETranslator构造函数,所以就没有初始化数据

    那怎么办了,就只能在静态变量初始化时赋值了,修改代码如下:

    1. QHash LinkTranslator::m_hash =
    2. {
    3. {"image", QStringLiteral("图像数据")},
    4. {"region", QStringLiteral("区域数据")},
    5. {"contours", QStringLiteral("轮廓数据")},
    6. };

    方案2:静态函数内定义对象,再访问变量

    如果在构造函数中初始化数据,只要调用构造函数就可以了

    1. class FLOWEDITORSHARED_EXPORT NETranslator
    2. {
    3. public:
    4. NETranslator();
    5. static QString ch2En(const QString &ch);
    6. static QString en2Ch(const QString &en);
    7. private:
    8. QHash m_hash;
    9. };
    10. NETranslator::NETranslator()
    11. {
    12. m_hash.insert("image", QStringLiteral("图像数据"));
    13. m_hash.insert("region", QStringLiteral("区域数据"));
    14. m_hash.insert("contours", QStringLiteral("轮廓数据"));
    15. }
    16. QString NETranslator::ch2En(const QString &ch)
    17. {
    18. NETranslator tran; //修改了此处
    19. QString en = tran.m_hash.key(ch, ch);
    20. return en;
    21. }
    22. QString NETranslator::en2Ch(const QString &en)
    23. {
    24. NETranslator tran; //修改了此处
    25. QString ch = tran.m_hash.value(en, en);
    26. return ch;
    27. }

  • 相关阅读:
    java开发工具MyEclipse 中实体关系设计器介绍
    Python之函数讲解
    不同类型的软件测试
    Failed to process, please exclude the tableName or statementId.
    Unity SteamVR 开发教程:用摇杆/触摸板控制人物持续移动(2.x 以上版本)
    【花雕动手做】有趣好玩的音乐可视化系列项目(30)--P6 LED单元板
    Java TCP网络编程
    COS对象存储
    Docker基础
    单标签下的日间/黑夜模式切换按钮效果
  • 原文地址:https://blog.csdn.net/qq_40602000/article/details/125879628