如何解决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 举报,一经查实,本站将立刻删除。