我在尝试将多个值 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::CLUBScard::rankType::TWO 都不是卡片。 引用的问题没有将两个值传递给push_back()。您是否碰巧注意到其中的 符号。在 C++ 中,这类事情真的很有意义。它们不仅仅是编译器忽略的某种装饰。这是使用现代 C++ 的统一初始化语法将 single 对象传递给 push_back() 的示例,该对象是通过将 xy 传递给对象的 构造函数 i>,与push_back()本身无关。 @SamVarshavchik 这很有意义。这与 Fareeish 的建议非常相似。我将查看他的答案并尝试将其与我的答案进行比较。 【参考方案1】:

首先,在您的card 类中,您定义了两个enum class 类型,但您没有指定cardrankTypesuitType 组成。我建议添加字段:

rankType rank;
suitType suit;

到你的card 班级。

那么,第二个问题在于您试图通过指定rankTypesuitType 来尝试push_backcard。您要么首先需要构造一个card,然后将push_back 构造到vector 中,或者使用emplace_backvector 内创建一个card,使用用于构造card 的参数。要使用push_back 方法,您可以替换:

originalCardDeck.push_back(card::suitType::CLUBS, card::rankType::TWO);

与:

originalCardDeck.push_back(cardcard::suitType::CLUBS, card::rankType::TWO);

但您需要一个初始化suitrank 的构造函数,如下所示:

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 持有cards。 card::suitType::CLUBScard::rankType::TWO 都不是 card。这应该如何工作? @Fureeish:回答发现的第一个问题,而不立即通知第二个问题。现在应该修复这两个错误。 @Fureeish 我认为它会起作用,因为 CLUBS 和 TWO 在不同的枚举下但在同一个类中。 @AngoMango 请参考我的回答。你只在你的类中定义了枚举。您没有指定 card 拥有 ranksuite。我通常建议不要假设有关 C++ 的事情,尤其是在开始学习 C++ 时。 @Fureeish 对不起,老实说,我忘了包括我的私人成员组。它确实包括等级和西装。

以上是关于我在尝试将多个值 push_back 到向量时遇到错误。我究竟做错了啥? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

push_back 上的分段错误[关闭]

指针问题向量

字符串向量 push_back 在类中失败

调整对象矢量大小时出错

矢量 push_back 随机发生

如何一次将多个整数传递给一个向量?