当前位置:网站首页>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;
}
边栏推荐
- 解决rpc error: code = Unimplemented desc = method CheckLicense not implemented
- 【TCP/IP】Network Model
- 作为面试官,关于线程池的问题我一般这样套路...
- JS中原型和原型链的详细讲解(附代码示例)以及 new关键字具体做了什么的详细讲解
- 如何将亚马逊广告添加到您的 WordPress 网站(3 种方法)
- 感情危机,朋友的网恋女友要和他闹分手,问我怎么办
- UE4插件软链接(关联)
- 来n遍剑指--06. 从尾到头打印链表
- [ verb phrase ] collection
- Solve rpc error: code = Unimplemented desc = method CheckLicense not implemented
猜你喜欢
随机推荐
(C语言)程序环境和预处理
湖仓一体电商项目(二):项目使用技术及版本和基础环境准备
如何将虚拟机上的文件复制到主机上
js radar chart statistical chart plugin
关于挂载EXfat文件格式U盘失败的问题
Mysql+Navicat for Mysql
js右侧圆点单页滚动介绍页面
Progressive Web App(PWA)
spark过滤器
postgresql generate random date, random time
Come n times - 07. Rebuild the binary tree
来n遍剑指--09. 用两个栈实现队列
Define event types in Splunk Web
[ 动词词组 ] 合集
学习笔记——七周成为数据分析师《第二周:业务》:业务分析框架
Kotlin—基本语法 (五)
JSP page对象简介说明
js雷达图统计图表插件
MySQL----多表查询
Open Kylin openKylin automation developer platform officially released