C++结构体内部无名枚举成员构造函数的初始化参数类型如何选择
问题原因说明
你遇到的编译报错核心是无名枚举是独立的类型,即便其底层存储为int,C也不支持int到枚举类型的隐式转换,你用int作为构造函数第一个参数的写法类型不匹配。
另外匿名联合的初始化需要注意:C11之前的标准不支持在构造函数初始化列表中直接初始化匿名联合成员,需在函数体内赋值;C++11及以上标准支持列表初始化写法。
修正方案
1. 适配无名枚举的参数类型
不需要修改原有枚举的内部无名写法,直接用decltype推导category成员的类型作为构造函数的第一个参数即可:
struct Token { Token(); // 新增两个构造函数声明,分别对应数值和变量类型的Token Token(decltype(category) cate, double num); Token(decltype(category) cate, char var); enum { NUMBER, VARIABLE, PLUS, MINUS, PRODUCT, DIVISION, POWER, SIN, COS } category; union { char variable; double number; }; };
2. 匿名联合的初始化实现
这里提供兼容旧标准和C++11+的两种写法:
兼容C++03的写法
// 数值类型Token构造实现 Token::Token(decltype(category) cate, double num) : category(cate) { number = num; } // 变量类型Token构造实现 Token::Token(decltype(category) cate, char var) : category(cate) { variable = var; }
C++11及以上标准简化写法
// 可直接在初始化列表初始化联合成员 Token::Token(decltype(category) cate, double num) : category(cate), number(num) {} Token::Token(decltype(category) cate, char var) : category(cate), variable(var) {}
可选可读性优化
如果可以接受对现有代码做微小调整,给内部枚举命名可以进一步提升代码可读性,且完全满足「枚举定义在结构体内部」的要求:
struct Token { enum Category { NUMBER, VARIABLE, PLUS, MINUS, PRODUCT, DIVISION, POWER, SIN, COS } category; // 构造函数可以直接明确参数类型,不需要decltype推导 Token(Category cate, double num); Token(Category cate, char var); // 其他成员不变 };
调用验证
修改完成后你期望的调用方式可以正常运行:
Token my_token(Token::NUMBER, 5); Token var_token(Token::VARIABLE, 'x');
内容的提问来源于stack exchange,提问作者Naitzirch
相关产品推荐
相关产品推荐

