[英]C++ Multiple Struct Vectors Error
我正在嘗試制作兩個包含自定義結構的不同向量,但是當我嘗試向向量添加元素時,它適用於“deck”向量,但會拋出“players”向量的錯誤。 我是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;
}
這是因為你有default_bet的默認值。 刪除它,它將工作或明確地構建對象而不是初始化列表
struct player
{
string name;
int bankroll;
int default_bet = 5;
player(string name_, int bankroll_, int default_bet_)
{
name=name_;
bankroll=bankroll_;
default_bet_=default_bet_;
}
};
players.push_back(player("Jim", 500, 5));
我不知道你的編譯選項,但警告
warning: extended initializer lists only available with -std=c++11 or -std=gnu++11|
我得出結論,c ++ 11(初始化列表)未啟用。
但是,盡管如此,代碼將無法編譯,因為初始化列表顯然無法處理參數的默認值。 在這種情況下,問題的根源是:
int default_bet = 5;
刪除默認值並啟用c ++ 11,然后您的代碼將起作用。
問題根本與矢量無關,但可以通過以下方式更簡單地看到:
card c { "Queen", 10, "Hearts" }; // OK (g++ -std=c++11)
player p { "Jim", 500, 5 }; // Not OK (g++ -std=c++11)
有一種叫做聚合初始化的東西,聚合可以從括號內的初始化列表中初始化,繞過構造函數。 但非聚合沒有這個; 它們只能由構造函數初始化。 player
和card
都有隱式生成的默認構造函數,不帶參數,這就是全部。
您的編譯器似乎將card
視為聚合,但player
不是。
在C ++ 11中,這是正確的,來自N3337 [dcl.init.aggr] / 1:
聚合是一個數組或類(第9節),沒有用戶提供的構造函數(12.1),非靜態數據成員(9.2)沒有大括號或相等的初始值,沒有私有或受保護的非靜態數據成員(第11條),沒有基類(第10條),沒有虛函數(10.3)。
但是在C ++ 14(N3936)中,這被改為:
聚合是一個數組或類(第9條),沒有用戶提供的構造函數(12.1),沒有私有或受保護的非靜態數據成員(第11條),沒有基類(第10條),沒有虛函數(10.3) )。
你的代碼中的= 5
是非靜態數據成員的大括號或者是相等的初始化器 ,所以我們可以看到在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
標志。 否則你將不得不提出一些丑陋的解決方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.