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

C++洗牌vector对象时遇C2672错误:‘swap’无匹配重载函数求助

解决C2672 'swap'编译错误及代码问题

问题原因分析

你的代码存在两个核心问题导致编译失败:

  1. 成员函数定义语法错误:类成员函数的定义格式错误,使用了void::card::而非正确的void card::写法。
  2. const成员变量阻塞swap操作:card类中包含未使用的const int numberOfDecks成员,编译器无法为包含const成员的类生成默认swap函数,而std::shuffle依赖swap交换容器元素,因此触发C2672错误。

修复步骤

1. 修正成员函数定义语法

将错误的函数定义:

void::card::setCardValue(const int& value, std::string suite, char pictureCard)
void::card::setDeck(const int& numberOfDecks) 

改为正确格式:

void card::setCardValue(const int& value, std::string suite, char pictureCard)
void card::setDeck(const int& numberOfDecks) 

2. 移除无用的const成员变量

从card类中删除const int numberOfDecks = 1;——该变量未被代码使用,且是导致swap错误的直接原因。

3. 可选设计优化(非编译必需)

当前card类既表示单张卡牌又管理卡组(包含vector<card> v),违反单一职责原则。建议拆分出两个类:

  • Card:仅存储单张卡牌的属性(花色、点数、类型)
  • Deck:负责创建、洗牌、管理卡牌集合

示例拆分后的简化结构:

class Card {
public:
    std::string suite;
    char pictureCard = 'n';
    int value = 0;
    void setCardValue(const int& value, std::string suite, char pictureCard);
};

class Deck {
public:
    std::vector<Card> cards;
    void createDeck(int numberOfDecks);
    void shuffleDeck();
    void printDeck();
};

修复后的完整代码

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <random>

class card
{
public:
    std::string suite;
    char pictureCard = 'n';
    int value = 0;
    void setCardValue(const int& value, std::string suite, char pictureCard);
    void getDeck();
    void setDeck(const int& numberOfDecks);
    void shuffle();
    std::vector<card> v;
};

void card::setCardValue(const int& value, std::string suite, char pictureCard)
{
    this->value = value;
    this->suite = suite;
    this->pictureCard = pictureCard;
}

void card::setDeck(const int& numberOfDecks) 
{
    card c1;
    for (int n = 0; n < numberOfDecks; n++)
    { 
        int j = 2;
        for (int i = 0; i < 9; i++) // 设置数字牌
        {
            c1.setCardValue(j, "Hearts", 'N');
            v.push_back(c1);
            c1.setCardValue(j, "Clubs", 'N');
            v.push_back(c1);
            c1.setCardValue(j, "Diamonds", 'N');
            v.push_back(c1);
            c1.setCardValue(j, "Spades", 'N');
            v.push_back(c1);
            j++;
        }

        for (int p = 0; p < 4; p++) // 设置花牌
        {
            char N = 'N';
            if (p == 0) { N = 'J'; }
            else if (p == 1) { N = 'Q'; }
            else if (p == 2) { N = 'K'; }
            else if (p == 3) { N = 'A'; };

            c1.setCardValue(10, "Hearts", N);
            v.push_back(c1);
            c1.setCardValue(10, "Clubs", N);
            v.push_back(c1);
            c1.setCardValue(10, "Diamonds", N);
            v.push_back(c1);
            c1.setCardValue(10, "Spades", N);
            v.push_back(c1);
        }
    }

    int seed = 1;
    std::default_random_engine e(seed);
    std::shuffle(v.begin(), v.end(), e);
}

void card::getDeck()
{
    for (auto it = begin(v); it != end(v); ++it)
    {
        std::cout << it->value << it->suite << it->pictureCard << std::endl;
    }
    std::cout << v.size() << std::endl;
}

int main()
{
    card c2;
    c2.setDeck(6);
    c2.getDeck();
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 21:39:36