簡體   English   中英

C ++多結構向量錯誤

[英]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)

有一種叫做聚合初始化的東西,聚合可以從括號內的初始化列表中初始化,繞過構造函數。 但非聚合沒有這個; 它們只能由構造函數初始化。 playercard都有隱式生成的默認構造函數,不帶參數,這就是全部。


您的編譯器似乎將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM