关于无法从“initializer-list”转换为“QJsonObject”解决办法

一、简述

前些天在工作中使用QJsonObject的构造进行初始化出现了一下的问题。我们先看一下下面QJsonObject的一种构造方法。

这里写图片描述

在我使用的VS2013版本编译时会出现无法从“initializer-list”转换为“QJsonObject”的问题。

问题出在Q_COMPILER_INITIALIZER_LISTS宏定义。(见下图)

class Q_CORE_EXPORT QJsonObject
{
public:
    QJsonObject();

#if defined(Q_COMPILER_INITIALIZER_LISTS) || defined(Q_QDOC)
    QJsonObject(std::initializer_list<QPair<QString, QJsonValue> > args)
    {
        initialize();
        for (std::initializer_list<QPair<QString, QJsonValue> >::const_iterator i = args.begin(); i != args.end(); ++i)
            insert(i->first, i->second);
    }
#endif

这里写图片描述

我们看到源码中 Q_COMPILER_INITIALIZER_LISTS 宏其实未定义。
而 该宏定义在qcompilerdetection.h中,具体可以看到

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

扫描二维码关注公众号,回复: 2463648 查看本文章

这里写图片描述

其实从上面可以看到有一处是需要支持c++11的,但是旧版本的VS2013对C++11的initialize-list语法不支持。

如果用VS2013 需要更新到 update3以上。支持 initialize-list语法.或者是下载新版本的VS2013安装包,我是直接下载了update5,然后修复了此问题。

在Creator中可以添加
DEFINES += Q_COMPILER_INITIALIZER_LISTS

CONFIG += c++11

windows {
DEFINES *= Q_COMPILER_INITIALIZER_LISTS
}

见以下链接的评论处。
https://www.devbean.net/2016/08/qt-creator-source-study-04/

猜你喜欢

转载自blog.csdn.net/goforwardtostep/article/details/78682277