2017-10-22 99 views
-3

我有以下代碼,在那裏我正在生成一副撲克牌。 首先,我使用函數convertIntToSuit確定西裝,然後進入下一個循環以填充卡片組。不過,我不斷收到以下錯誤:使用push_back與結構數據類型C++時收到錯誤

Running /home/ubuntu/workspace/A5/Assignment5/main.cpp 
make: Entering directory `/home/ubuntu/workspace/A5/Assignment5' 
Compiling main.o 
g++ -Wall -g -O3 -std=c++11 -I/usr/include -c -o main.o main.cpp 
main.cpp: In function ‘int main()’: 
main.cpp:39:33: error: no matching function for call to ‘std::vector<Card>::push_back(<brace-enclosed initializer list>)’ 
      deck.push_back({i,s}); 

這裏是我的代碼:

// The include section adds extra definitions from the C++ standard library. 
#include <iostream> // For cin, cout, etc. 
#include <iomanip> // For text formatting (setprecision, setw, etc.) 
#include <cmath> // For math functions (sin, cos, pow, etc.) 
#include <cstdlib> 
#include <vector> 
#include <string> 

#include"convertIntToSuit.h" 
#include"printCard.h" 
//#include"shuffleDeck.h" 

using namespace std; 

struct Card { 
    string suit; 
    int rank; 
}; 

int main() { 
    vector<Card> deck; 
    for(int j = 0; j<4; ++j){ 
     string s = convertIntToSuit(j); 
     for(int i=1; i<=13; ++i){ 
      deck.push_back({i,s}); 
     } 
    } 
    return 0; 
} 
+0

支撐初始化列表中的第一個值是一個整數,第二個值是一個字符串。現在繼續盯着你的'Card'類,直到你看到你自己的錯誤。 –

+0

謝謝,我以爲我已經切換了這些,但我猜不是 –

回答

0

做這樣每次迭代: -

Card c1; 
c1.suit=s; 
c1.rank=i 
deck.push_back(c1); 

或者

你在做什麼wi會是: -

deck.push_back({s,i}); 

string會之前,首先int,因爲你struct declaration的。

0

push_back函數不理解你發送給它的東西。將大括號Card的兩個屬性括起來是不夠的。在將它發送到push_back之前,必須先構造Card結構。

0

有2個選項的位置:

  1. 無論是構造明確卡對象:deck.push_back(Card{s,i});

  2. 建構卡對象就地內部載體。這可以消除不必要的對象副本,但在這種情況下,好處可以忽略不計。但爲此,您需要定義一個明確的同時採用兩個參數的c'tor。 C++ 11不允許用參數隱式構造對象。 一旦你有了c'tor,你可以使用emplace_back成員函數,它完全按照你的意願去做:它將參數傳遞給構造函數,並用這些參數就地構造對象。你的情況:

    struct Card { 
        string suit; 
        int rank; 
        Card(string s = string(), int r = 0) : suit(std::move(s)), rank(r) {} 
    }; 
    
    for (int i=1; i<=13; ++i){ 
        deck.emplace_back(i,s); 
    } 
    

請注意,使用emplace_back當你不需要花括號。