gpt4 book ai didi

C++ 多结构 vector 错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:01:12 24 4
gpt4 key购买 nike

我正在尝试制作两个包含自定义结构的不同 vector ,但是当我尝试向 vector 添加元素时,它适用于“甲板” vector ,但会引发“玩家” vector 错误。我是 C++ 的新手,不知道哪里出了问题。

这些是它抛出的错误:

warning: extended initializer lists only available with -std=c++11 or -std=gnu++11|

error: no matching function for call to 'std::vector<BlackjackClass::player>::push_back(<brace-enclosed initializer list>)'|

这是我使用的代码:

#include <iostream>
#include <string>
#include <vector>

using namespace std;

class BlackjackClass {

private:
struct card
{
string label;
int value;
string suit;
};
vector<card> deck;

struct player
{
string name;
int bankroll;
int default_bet = 5;
};
vector<player> players;

public:
BlackjackClass()
{
// Works
deck.push_back({"Queen", 10, "Hearts"});
// Doesn't Work
players.push_back({"Jim", 500, 5});

}
};

int main()
{
BlackjackClass Blackjack;
}

最佳答案

这个问题根本与 vector 无关,但可以通过以下更简单地看出:

card c { "Queen", 10, "Hearts" };    // OK     (g++ -std=c++11)
player p { "Jim", 500, 5 }; // Not OK (g++ -std=c++11)

有一种叫做聚合初始化的东西,它可以绕过构造函数从大括号括起来的初始化列表中初始化聚合。但是非聚合没有这个;它们只能由它们的构造函数初始化。 playercard 都有隐式生成的不带参数的默认构造函数,仅此而已。


您的编译器似乎将 card 视为聚合,但 player 不是。

在 C++11 中这是正确的,来自 N3337 [dcl.init.aggr]/1:

An aggregate is an array or a class (Clause 9) with no user-provided constructors (12.1), no brace-or-equal- initializers for non-static data members (9.2), no private or protected non-static data members (Clause 11), no base classes (Clause 10), and no virtual functions (10.3).

但是在 C++14 (N3936) 中,这被更改为:

An aggregate is an array or a class (Clause 9) with no user-provided constructors (12.1), no private or protected non-static data members (Clause 11), no base classes (Clause 10), and no virtual functions (10.3).

代码中的 = 5 是非静态数据成员的 brace-or-equal-initializer ,因此我们可以在 C++11 中看到player 不是聚合,但在 C++14 中 player 是聚合。

用 g++ 测试,我发现 g++ 5.1 正确地实现了这个行为——代码被 -std=c++11 拒绝并被 -std=c++14< 接受。但是,g++ 4.9.2 拒绝带有 -std=c++14 的代码,因此这将是该版本 g++ 中的编译器错误。


结论:如果您可以访问 g++ 5.1(或正确实现 C++14 的其他编译器),那么一个解决方案是使用 -std=c++14 编译代码时的标志。否则,您将不得不采用一些丑陋的解决方法。

关于C++ 多结构 vector 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33553980/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com