2017-10-22 211 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当你不需要花括号。