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

本文探讨了在使用VS2013编译时遇到的QJsonObject构造问题,主要原因是编译器对C++11的initializer-list语法支持不足。文中提供了几种解决方案,包括更新VS版本或配置文件中启用C++11支持。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、简述

前些天在工作中使用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中,具体可以看到

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

其实从上面可以看到有一处是需要支持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/

在C++中,初始化列表(initializer list)用于在对象创建时初始化其成员变量。如果你在使用初始化列表时遇到“无法从initialize list转换为此类型”的错误,通常是因为类型不匹配或构造函数不接受初始化列表作为参数。 以下是一些解决方法: 1. **确保类型匹配**: 确保你传递给构造函数的类型与构造函数参数的类型匹配。例如,如果你有一个接受`std::vector<int>`的构造函数,确保你传递的是`std::initializer_list<int>`。 ```cpp class MyClass { public: MyClass(std::vector<int> vec) : vec_(vec) {} private: std::vector<int> vec_; }; // 正确用法 MyClass obj({1, 2, 3}); ``` 2. **使用构造函数接受`std::initializer_list`**: 如果你希望使用初始化列表初始化对象,可以为类添加一个接受`std::initializer_list`的构造函数。 ```cpp class MyClass { public: MyClass(std::initializer_list<int> initList) { for (auto& item : initList) { vec_.push_back(item); } } private: std::vector<int> vec_; }; // 正确用法 MyClass obj = {1, 2, 3}; ``` 3. **显式类型转换**: 如果类型不匹配,你可以显式地进行类型转换。例如,将`std::initializer_list`转换为`std::vector`。 ```cpp class MyClass { public: MyClass(const std::vector<int>& vec) : vec_(vec) {} private: std::vector<int> vec_; }; // 显式转换 MyClass obj(std::vector<int>({1, 2, 3})); ``` 通过以上方法,你可以解决初始化列表转换时遇到的问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值