当前位置:网站首页>Qt 编译错误:C2228: “.key”的左边必须有类/结构/联合
Qt 编译错误:C2228: “.key”的左边必须有类/结构/联合
2022-07-31 09:43:00 【Jason~shen】
目录
一、产生原因
原因:静态函数访问了非静态变量, static函数与非static变量混用,示例代码如下
class FLOWEDITORSHARED_EXPORT NETranslator
{
public:
NETranslator();
static QString ch2En(const QString &ch);
static QString en2Ch(const QString &en);
private:
QHash<QString, QString> m_hash;
};
//
NETranslator::NETranslator()
{
m_hash.insert("image", QStringLiteral("图像数据"));
m_hash.insert("region", QStringLiteral("区域数据"));
m_hash.insert("contours", QStringLiteral("轮廓数据"));
}
QString NETranslator::ch2En(const QString &ch)
{
QString en = m_hash.key(ch, ch);
return en;
}
QString NETranslator::en2Ch(const QString &en)
{
QString ch = m_hash.value(en, en);
return ch;
}
上述代码编译将会出现以下错误:
NETranslator.cpp:12: error: C2228: “.key”的左边必须有类/结构/联合
NETranslator.cpp:18: error: C2228: “.value”的左边必须有类/结构/联合
二、解决方案
方案1:静态函数访问静态变量
那么把类变量也声明为static是否有用了,修改代码如下:
class FLOWEDITORSHARED_EXPORT NETranslator
{
public:
NETranslator();
static QString ch2En(const QString &ch);
static QString en2Ch(const QString &en);
private:
static QHash<QString, QString> m_hash; //修改了此处,静态声明
};
再次编译出现了以下错误
NETranslator.obj error: LNK2019: 无法解析的外部符号 "public: static class QHash<class QString,class QString> NETranslator::m_hash" ([email protected]@@[email protected]@@[email protected]@@A),该符号在函数 "public: __cdecl NETranslator::NETranslator(void)" ([email protected]@[email protected]) 中被引用
无法解析的外部符号大部分原因是只做了声明,没有定义。类的静态成员必须在类内声明,在类外初始化。修改代码如下:
class FLOWEDITORSHARED_EXPORT NETranslator
{
public:
NETranslator();
static QString ch2En(const QString &ch);
static QString en2Ch(const QString &en);
private:
static QHash<QString, QString> m_hash; //修改了此处,静态声明
};
//
QHash<QString, QString> NETranslator::m_hash; //修改了此处,定义
NETranslator::NETranslator()
{
m_hash.insert("image", QStringLiteral("图像数据"));
m_hash.insert("region", QStringLiteral("区域数据"));
m_hash.insert("contours", QStringLiteral("轮廓数据"));
}
QString NETranslator::ch2En(const QString &ch)
{
QString en = m_hash.key(ch, ch);
return en;
}
QString NETranslator::en2Ch(const QString &en)
{
QString ch = m_hash.value(en, en);
return ch;
}
声明也有了,定义也有了,编译通过。上述方案m_hash虽然插入了值,但是函数中访问的m_hash数据为空。
原因:使用NETranslator::ch2En() 方式去调用,并没有调用NETranslator构造函数,所以就没有初始化数据
那怎么办了,就只能在静态变量初始化时赋值了,修改代码如下:
QHash<QString, QString> LinkTranslator::m_hash =
{
{"image", QStringLiteral("图像数据")},
{"region", QStringLiteral("区域数据")},
{"contours", QStringLiteral("轮廓数据")},
};
方案2:静态函数内定义对象,再访问变量
如果在构造函数中初始化数据,只要调用构造函数就可以了
class FLOWEDITORSHARED_EXPORT NETranslator
{
public:
NETranslator();
static QString ch2En(const QString &ch);
static QString en2Ch(const QString &en);
private:
QHash<QString, QString> m_hash;
};
NETranslator::NETranslator()
{
m_hash.insert("image", QStringLiteral("图像数据"));
m_hash.insert("region", QStringLiteral("区域数据"));
m_hash.insert("contours", QStringLiteral("轮廓数据"));
}
QString NETranslator::ch2En(const QString &ch)
{
NETranslator tran; //修改了此处
QString en = tran.m_hash.key(ch, ch);
return en;
}
QString NETranslator::en2Ch(const QString &en)
{
NETranslator tran; //修改了此处
QString ch = tran.m_hash.value(en, en);
return ch;
}
边栏推荐
- Flink1.15源码阅读flink-clients——flink命令行帮助命令
- Use turtle to draw buttons
- (C language) program environment and preprocessing
- Redis集群-哨兵模式原理(Sentinel)
- OpenGL es 导读篇
- js right dot single page scrolling introduction page
- loadrunner-controller-场景执行run
- JSP page对象简介说明
- qt在不同的线程中传递自定义结构体参数
- JS中原型和原型链的详细讲解(附代码示例)以及 new关键字具体做了什么的详细讲解
猜你喜欢
随机推荐
GVINS论文阅读笔记
(C语言)程序环境和预处理
第二十四课、二十五课,高级光照(blinn),Gamma矫正
Gradle series - Groovy overview, basic use (based on Groovy document 4.0.4) day2-1
恋爱期间的赠与能否撤销
Chapter Six
5.for in 和 for of区别和使用
Kotlin入门介绍篇
js radar chart statistical chart plugin
文件管理:目录管理
乐观锁和悲观锁
postgresql 范围查询比索引查询快吗?
如何在 TiDB Cloud 上使用 Databricks 进行数据分析 | TiDB Cloud 使用指南
SQLite3交叉编译
[NLP] Interpretation of Transformer Theory
OpenGL es 初识
来n遍剑指--06. 从尾到头打印链表
MySQL 的几种碎片整理方案总结(解决delete大量数据后空间不释放的问题)
多版本node的安装与切换详细操作
Flink1.15源码阅读——PER_JOB vs APPLICATION执行流程