我在尝试将多个值 push_back 到向量时遇到错误。我究竟做错了啥? [关闭]
Posted
技术标签:
【中文标题】我在尝试将多个值 push_back 到向量时遇到错误。我究竟做错了啥? [关闭]【英文标题】:I'm getting an error trying to push_back multiple values to a vector. What am I doing wrong? [closed]我在尝试将多个值 push_back 到向量时遇到错误。我究竟做错了什么? [关闭] 【发布时间】:2019-09-03 00:17:36 【问题描述】:我正在尝试将多个项目 push_back 到一个向量。但它不让我,它给了我一个错误。
我在网上查了一下,发现有人像我一样使用了 push_back 功能并且可以使用。我认为这是我不能 push_back 多个项目的事实,所以我删除了额外的传递值,但我仍然得到同样的错误。
出错的函数(红线在push_back函数前的点下):
originalCardDeck.push_back(card::suitType::CLUBS, card::rankType::TWO);
包含向量的类。
class deck
public:
deck()
originalCardDeck.push_back(card::suitType::CLUBS, card::rankType::TWO);
~deck();
void printDeck(int deck[]);
private:
vector<card>originalCardDeck;
vector<card>shuffledCardDeck;
;
包含枚举类型的卡片类。
class card
public:
card();
~card();
enum class rankType
TWO = 2,
THREE,
FOUR,
FIVE,
SIX,
SEVEN,
EIGHT,
NINE,
TEN,
JACK,
QUEEN,
KING,
ACE
;
enum class suitType
CLUBS,
DIAMONDS,
HEARTS,
SPADES
private:
rankType rank;
suitType suit;
;
我收到一条错误消息:
C++ no instance of overloaded function matches the argument list
argument types are: (card::suitType, card::rankType)
object type is: std::vector<card, std::allocator<card>>
我对这一行的意图是能够将包含多种数据类型的元素 push_back 到一个向量中,以便我以后可以引用它。如果没有错误信息,我会把它放在 for 循环中。
【问题讨论】:
如果你真的“在网上查过”,你能引用一些声称push_back()
接受两个或更多参数的引用,这就是你在做什么?或许您可以在in a good C++ book 中找到一些更高质量的信息以及更多信息和有用的 C++ 学习资料,而不是在线查看?
@SamVarshavchik ***.com/questions/18104928/… ***.com/questions/45080937/…。这可能看起来无关紧要,但它看起来就像我正在尝试做的事情。
顺便说一句,card::suitType::CLUBS
或 card::rankType::TWO
都不是卡片。
引用的问题没有将两个值传递给push_back()
。您是否碰巧注意到其中的
和
符号。在 C++ 中,这类事情真的很有意义。它们不仅仅是编译器忽略的某种装饰。这是使用现代 C++ 的统一初始化语法将 single 对象传递给 push_back()
的示例,该对象是通过将 x
和 y
传递给对象的 构造函数 i>,与push_back()
本身无关。
@SamVarshavchik 这很有意义。这与 Fareeish 的建议非常相似。我将查看他的答案并尝试将其与我的答案进行比较。
【参考方案1】:
首先,在您的card
类中,您定义了两个enum class
类型,但您没有指定card
由rankType
和suitType
组成。我建议添加字段:
rankType rank;
suitType suit;
到你的card
班级。
那么,第二个问题在于您试图通过指定rankType
和suitType
来尝试push_back
和card
。您要么首先需要构造一个card
,然后将push_back
构造到vector
中,或者使用emplace_back
在vector
内创建一个card
,使用用于构造card
的参数。要使用push_back
方法,您可以替换:
originalCardDeck.push_back(card::suitType::CLUBS, card::rankType::TWO);
与:
originalCardDeck.push_back(cardcard::suitType::CLUBS, card::rankType::TWO);
但您需要一个初始化suit
和rank
的构造函数,如下所示:
card(suitType suit, rankType rank) : suit(suit), rank(rank)
有了那个构造函数,最好在这里实际使用emplace_back
:
originalCardDeck.emplace_back(card::suitType::CLUBS, card::rankType::TWO);
它在vector
内构造一个card
,而不是创建一个临时对象然后将其复制(由于右值引用而移动,此处是一个简单的复制)到所说的vector
。
【讨论】:
我们还没有了解 emplace_back,所以我想继续使用到目前为止我们已经讨论过的材料。因此,对于您建议的 push_back 行,它将一个卡片对象推送到包含来自两个枚举类型的值的向量中。如果我把它放在一个 for 循环中,这是否意味着我的向量将包含多个卡片对象,这些卡片对象包含我选择的两种枚举类型?像一个动态的对象数组? @AngoMango 是的,没错。【参考方案2】:你有几个问题:
您一次只能push_back
一项。
卡没有带 2 个参数的构造函数:
你可以这样做:
card(suitType, rankType) /*..*/
和
deck()
originalCardDeck.push_back(card::suitType::CLUBS, card::rankType::TWO)
对于deck
,可以不用push_back
直接初始化vector:
deck() : originalCardDeckcard::suitType::CLUBS, card::rankType::TWO
【讨论】:
originalCardDeck
持有card
s。 card::suitType::CLUBS
和 card::rankType::TWO
都不是 card
。这应该如何工作?
@Fureeish:回答发现的第一个问题,而不立即通知第二个问题。现在应该修复这两个错误。
@Fureeish 我认为它会起作用,因为 CLUBS 和 TWO 在不同的枚举下但在同一个类中。
@AngoMango 请参考我的回答。你只在你的类中定义了枚举。您没有指定 card
拥有 rank 和 suite。我通常建议不要假设有关 C++ 的事情,尤其是在开始学习 C++ 时。
@Fureeish 对不起,老实说,我忘了包括我的私人成员组。它确实包括等级和西装。以上是关于我在尝试将多个值 push_back 到向量时遇到错误。我究竟做错了啥? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章