2016-01-10 10 views
15

यह शायद एक बहुत ही सरल जवाब है, लेकिन मैं वास्तव में इसे समझ नहीं सकता। ऐसा करने के लिए मुझे त्रुटियां क्यों मिलती हैं? इस तरह कुछ शुरू करने का सही तरीका क्या है?घुंघराले ब्रेसिज़ के साथ tuples की एक std :: सरणी शुरू करें

std::array<std::tuple<int, std::string>, 3> tuples{ 
    {3, "a"}, 
    {7, "b"}, 
    {2, "c"} 
}; 

MSVC 2015 को मैं निम्नलिखित त्रुटियाँ मिलती है:

No suitable constructor exists to convert from "int" to "std::tuple<int, std::string>" 
No suitable constructor exists to convert from "const char[2]" to "std::tuple<int, std::string>" 

उत्तर

24

यह tuple साथ एक उत्कृष्ट मुद्दा है। देखें, its constructor in C++11/14 is explicit। और इसलिए, यह प्रति-सूची-प्रारंभिकरण में भाग नहीं ले सकता है, जो कि आंतरिक ब्रेसिड-इनिट-सूचियां करता है (बाहरी वाले प्रत्यक्ष-सूची-प्रारंभिक होते हैं)।

विचार prevent you from being able to bypass a class's explicit constructors through tuple था। लेकिन, सी ++ 17 में, यह बदला जाएगा: यदि सभी टुपल के प्रकार संबंधित रूप से संबंधित प्रकार से पूरी तरह से परिवर्तनीय हैं, तो tuple का भी निर्माता होगा।

अपने विशिष्ट उपयोग के मामले के लिए, आप std :: pair का उपयोग कर सकते हैं। इसका कन्स्ट्रक्टर कभी भी explicit नहीं है।

+1

इसलिए यही कारण है कि दूसरे व्यक्ति के हटाए गए उत्तर वास्तव में पोस्ट करने से पहले काम करते थे। मैंने सोचा कि शायद कुछ और कर रहा है जिसे मैं उम्मीद नहीं कर रहा था। मान लीजिए मुझे एक सी सरणी का उपयोग करना होगा या फिर इसे इस तरह से करना होगा। उह ... सी ++ 17 पर्याप्त तेज़ी से नहीं आ सकता – Alex

+1

@AlexYan: आप 'जोड़ी' का उपयोग कर सकते हैं, क्योंकि आपके वर्तमान प्रकार में केवल दो memebers हैं। –

+1

'std :: make_tuple' भी काम करता है। (पता नहीं क्यों) – edmz

संबंधित मुद्दे