当前位置:网站首页>Qt compile error: C2228: '.key' must have class/struct/union on the left
Qt compile error: C2228: '.key' must have class/struct/union on the left
2022-07-31 09:48:00 【Jason~shen】
目录
方案1:Static functions access static variables
方案2:Objects are defined inside static functions,Access the variable again
一、产生原因
原因:A static function accesses a non-static variable, staticfunction and notstatic变量混用,示例代码如下
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;
}
Compilation of the above code will give the following error:
NETranslator.cpp:12: error: C2228: “.key”的左边必须有类/结构/联合
NETranslator.cpp:18: error: C2228: “.value”的左边必须有类/结构/联合
二、解决方案
方案1:Static functions access static variables
Then declare the class variable as staticIs it useful,修改代码如下:
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; //修改了此处,静态声明
};
Compiling again gave the following error
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]) 中被引用
Unresolved external symbols are mostly just declared,没有定义.Static members of a class must be declared within the class,在类外初始化.修改代码如下:
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;
}
There is also a statement,There are also definitions,编译通过.上述方案m_hashAlthough the value is inserted,But the function is accessedm_hash数据为空.
原因:使用NETranslator::ch2En() 方式去调用,并没有调用NETranslator构造函数,So there is no initialization data
那怎么办了,It can only be assigned when a static variable is initialized,修改代码如下:
QHash<QString, QString> LinkTranslator::m_hash =
{
{"image", QStringLiteral("图像数据")},
{"region", QStringLiteral("区域数据")},
{"contours", QStringLiteral("轮廓数据")},
};
方案2:Objects are defined inside static functions,Access the variable again
If you initialize the data in the constructor,Just call the constructor and that's it
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;
}
边栏推荐
猜你喜欢
随机推荐
qt pass custom structure parameters in different threads
【微信小程序开发】生命周期与生命周期函数
loadrunner脚本--添加检查点
vue element form表单规则校验 点击提交后直接报数据库错误,没有显示错误信息
ReentrantLock
来n遍剑指--07. 重建二叉树
【职场杂谈】售前工程师岗位的理解杂谈
js department budget and expenditure radar chart
【节选】吴恩达给出的AI职业生涯规划
各位大佬,sqlserver 支持表名正则匹配吗
NowCoderTOP17-22 二分查找/排序——持续更新ing
loadrunner-controller-目标场景Schedule配置
Feign介绍
js部门预算和支出雷达图
centos7安装mysql5.7
[ 动词词组 ] 合集
postgresql 生成随机日期,随机时间
postgresql generate random date, random time
VMware下安装win10启动后进入Boot Manger界面如何解决
Module eight