当前位置:网站首页>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;
}边栏推荐
- 自定义v-drag指令(横向拖拽滚动)
- Scala basics [seq, set, map, tuple, WordCount, queue, parallel]
- (C语言)程序环境和预处理
- 比较并交换 (CAS) 原理
- Open Kylin openKylin automation developer platform officially released
- js right dot single page scrolling introduction page
- Business-(Course-Chapter-Subsection) + Course Publishing Some Business Ideas
- Gradle系列——Groovy概述,基础使用(基于Groovy文档4.0.4)day2-1
- 浓眉大眼的谷歌 Chrome 也叛变了,教你一招快速清除其自带广告
- Splunk Workflow action 给我们带来的好处
猜你喜欢
随机推荐
HTC官方RUU固件提取刷机包rom.zip以及RUU解密教程
浓眉大眼的谷歌 Chrome 也叛变了,教你一招快速清除其自带广告
[ verb phrase ] collection
一些计时软件,生产力工具
安装gnome-screenshot截图工具
js radar chart statistical chart plugin
Are postgresql range queries faster than index queries?
P5231 [JSOI2012]玄武密码(SAM 经典运用)
数字加分隔符
文件管理:目录管理
基于学生成绩管理系统(附源代码及数据库)
[NLP] Interpretation of Transformer Theory
第五章
【机器学习】用特征量重要度(feature importance)解释模型靠谱么?怎么才能算出更靠谱的重要度?
spark过滤器
Kotlin—基本语法 (四)
开放麒麟 openKylin 自动化开发者平台正式发布
Splunk Workflow action 给我们带来的好处
Redis Sentinel原理
恋爱期间的赠与能否撤销








