2017-10-22 20 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

ブレースされた初期化リストの最初の値は整数で、2番目の値は文字列です。あなた自身のバグが見えるまで、 'Card'クラスを見つめてください。 –

+0

ありがとう、私はそれらを切り替えていたと思ったが、私はそう思わない –

答えて

0

は、すべての反復のために、このようにそれを実行します -

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

それとも

あなたは何をしていますかできるでしょう: -

deck.push_back({s,i}); 

stringがあるため、あなたのstruct declarationint前に最初に来ます。

0

push_back関数は、送信する内容を理解していません。 Cardの2つのプロパティを中括弧で囲むだけでは不十分です。 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を使用しているときは、中括弧を必要としないことに注意してください。

関連する問題