C++ 基于枚举类实现扑克牌组及rank_t枚举编译报错求解
问题修复方案
错误根因
你定义的rank_t枚举存在的编译错误来源于:jack = J、queen = Q、king = K、ace = A四行的右值J/Q/K/A都是未声明的标识符。C++不会默认将单个字母识别为合法常量,你需要为枚举项指定合法的数值:
- 如果你只是需要区分牌面大小,直接按排序规则给连续整数值即可(推荐,更方便后续排序逻辑实现)
- 如果你需要让枚举值对应牌面字符的ASCII码,需要给字母加单引号包裹为字符常量,比如
'J'
修正后的代码示例
struct card_t { enum class rank_t: unsigned char { two = 2, three = 3, four = 4, five = 5, six = 6, seven = 7, eight = 8, nine = 9, ten = 10, jack = 11, queen = 12, king = 13, ace = 14 }; enum class suit_t: unsigned char { d = 1, // 按你给出的示例排序优先级调整枚举值:d < s < c < h s = 2, c = 3, h = 4 }; rank_t rank; suit_t suit; // 可选:重载比较运算符方便后续排序 bool operator<(const card_t& other) const { if (suit != other.suit) { return static_cast<unsigned char>(suit) < static_cast<unsigned char>(other.suit); } return static_cast<unsigned char>(rank) < static_cast<unsigned char>(other.rank); } };
补充说明
要实现你提到的字符串列表解析过滤功能,你需要额外实现字符串转card_t的转换逻辑:
- 解析输入字符串的rank部分:如果首字符是
'1',则对应rank_t::ten;如果是'J'/'Q'/'K'/'A'分别对应J/Q/K/A的枚举值;其余数字字符转成对应整数匹配rank即可 - 解析输入字符串的最后一个字符对应花色:
'h'/'d'/'c'/'s'分别匹配suit_t的对应枚举值 - 所有卡片解析完成后,直接调用标准库的
sort函数即可得到你给出示例的排序结果
内容的提问来源于stack exchange,提问作者Zack Bunch
相关产品推荐
相关产品推荐

