C++洗牌vector对象时遇C2672错误:‘swap’无匹配重载函数求助
解决C2672 'swap'编译错误及代码问题
问题原因分析
你的代码存在两个核心问题导致编译失败:
- 成员函数定义语法错误:类成员函数的定义格式错误,使用了
void::card::而非正确的void card::写法。 - 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
相关产品推荐
相关产品推荐

