You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的转换逻辑:

  1. 解析输入字符串的rank部分:如果首字符是'1',则对应rank_t::ten;如果是'J'/'Q'/'K'/'A'分别对应J/Q/K/A的枚举值;其余数字字符转成对应整数匹配rank即可
  2. 解析输入字符串的最后一个字符对应花色:'h'/'d'/'c'/'s'分别匹配suit_t的对应枚举值
  3. 所有卡片解析完成后,直接调用标准库的sort函数即可得到你给出示例的排序结果

内容的提问来源于stack exchange,提问作者Zack Bunch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 09:33:00