微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c++11中如何避免缩小转换的错误

如何解决c++11中如何避免缩小转换的错误

我有下面的代码,它使用枚举值来初始化结构的向量。 我收到了关于窄转换的错误。我参考了 Microsoft 文档:link 我可以通过以下代码解决问题。

#include <iostream>
#include <vector>
#include <string>

enum NUMBERS
{
    NUMBERS_ZERO    = 0xA0000000,NUMBERS_ONE     = 0xA0000001,NUMBERS_TWO     = 0xA0000002,NUMBERS_THREE   = 0xA0000003,};

struct Person {
    uint32_t        m_id = 0;
    std::string     m_name;

    Person(uint32_t id,std::string name) :
        m_id(id),m_name(name) {}
};

std::vector<Person> PersonList =
{
    {static_cast<uint32_t>(NUMBERS_ZERO),"abc"},{static_cast<uint32_t>(NUMBERS_ONE),"pqr"},{static_cast<uint32_t>(NUMBERS_TWO),"xyz"},{static_cast<uint32_t>(NUMBERS_THREE),"zzz"}
};

int main()
{
    for (auto it : PersonList)
        std::cout << it.m_id << " : " << it.m_name << "\n";
    return 0;
}

因为我们可以看到上面带有类型转换的 vector 初始化看起来很奇怪/复杂。我怎样才能提高代码的可读性。我已经尝试了下面的代码,但它抛出 error: Conversion from 'Numbers' to 'uint32_t' requires a narrow conversion. 任何建议将不胜感激。

/*
struct Person {
    uint32_t        m_id = 0;
    std::string     m_name;

    Person(uint32_t id,std::string name) :
        m_id(static_cast<uint32_t>(id)),m_name(name) {}
};

std::vector<Person> PersonList =
{
    {NUMBERS_ZERO,{NUMBERS_ONE,{NUMBERS_TWO,{NUMBERS_THREE,"zzz"}
};
*/

解决方法

您可以定义用于枚举的类型,这将使​​不需要强制转换:

enum NUMBERS : uint32_t
{
    NUMBERS_ZERO    = 0xA0000000,NUMBERS_ONE     = 0xA0000001,NUMBERS_TWO     = 0xA0000002,NUMBERS_THREE   = 0xA0000003,};

如果没有类型定义,可以假定数字是有符号的并且不适合 32 位整数,因此使用了缩小转换。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。