使用带有结构数据类型c ++的push_back时收到错误

时间:2017-10-22 02:57:39

标签: c++ c++11

我有以下代码,我正在生成一副牌。 首先,我使用函数convertIntToSuit确定套装,然后进入下一个循环以填充卡片组。但我不断收到以下错误:

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; 
}

3 个答案:

答案 0 :(得分:0)

每次迭代都这样做: -

application_controller.rb

你正在做的将是: -

Card c1;
c1.suit=s;
c1.rank=i
deck.push_back(c1);   
由于deck.push_back({s,i});

string将在int之前出现。

答案 1 :(得分:0)

push_back功能无法理解您发送给它的内容。将Card的两个属性括在花括号中是不够的。在将它发送到push_back之前,必须构造Card结构。

答案 2 :(得分:0)

这里有两个选项:

  1. 明确构建Card对象:deck.push_back(Card{s,i});

  2. 在向量内部构造卡对象。这可以消除不需要的对象副本,但在这种情况下,好处可以忽略不计。但是为此你需要定义一个带有两个参数的显式c。 c ++ 11不允许使用参数隐式构造对象。 一旦你有了c&#39;你可以使用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);
     }
    
  3. 请注意,使用emplace_back时不需要大括号。