2017-03-10 16 views
5

मैं एक संग्रह के रूप में परिभाषित किया गया है जोड़ी -वेक्टर - वर्दी प्रारंभ

using Parameters = std::vector<int>; 
using Group = std::pair<std::string, Parameters>; 
std::vector<Group> inputs; 

मेरे इरादे की तरह

inputs.push_back(group0 /*What goes in here ?*/); 
inputs.push_back(group1 /*What goes in here ?*/); 

मैं कैसे प्रारंभ कर सकते हैं group0 और group1 प्रारंभकर्ता सूची का उपयोग कर बयान उपयोग करने के लिए है? इस तरह इस कोड को काम करने के लिए

inputs.push_back(std::make_pair("group0", {1, 2, 3, 4})); 

संपादित नहीं लगता है: वहाँ वेक्टर जोड़ी आरंभीकरण पर पहले से ही विद्यमान सवाल कर रहे हैं, लेकिन मैं किसी भी दिखाई दे रहे हैं जहां std::pair की second फिर से एक संग्रह है ।

+1

पर एक नज़र डालें [ 'वेक्टर :: emplace_back()'] (http://www.cplusplus.com/reference/vector/vector/emplace_back/)। यह जगहस्थल निर्माण करता है यानी आप सीधे तर्क पारित कर सकते हैं और "समूह" का उदाहरण "अंतिम" भंडारण स्थान पर बनाया गया है। – Scheff

उत्तर

10

जब आप inputs.push_back(std::make_pair("group0", {1, 2, 3, 4})) लिखते हैं तो आप make_pair से अपने तर्कों के प्रकारों को कम करने के लिए कह रहे हैं। लेकिन दूसरा तर्क, ब्रेस्ड-इनिट-सूची, अभिव्यक्ति नहीं है, इसलिए इसमें कोई प्रकार नहीं है। इसलिए, टेम्पलेट तर्क कटौती विफल रहता है।

सबसे आसान समाधान make_pair पर कॉल को निकालना है और हर जगह ब्रेस्ड-इनिट-सूचियों का उपयोग करना है।

inputs.push_back({"group0", {1, 2, 3, 4}}); 

अब, सूची प्रारंभ enumerate available constructors होगा और भीतरी braced-init-सूची के लिए बहस के बाहरी जोड़ी के साथ pair निर्माता, और vector निर्माता कहते हैं।

1

जबकि

inputs.push_back({"group0", {1, 2, 3, 4}}); 

तुम क्या करने का इरादा क्या ठीक से काम करता है, मुझे लगता है कि यह उपयोग करने के लिए अधिक अर्थपूर्ण है:

inputs.push_back(std::make_pair("group0", Parameters{1, 2, 3, 4})); 
संबंधित मुद्दे