2012-07-31 6 views
10

this answer से प्रेरित होकर, मैं अगले उदाहरण की कोशिश की:मानचित्र प्रारंभ करते समय ब्रेसिज़ को क्यों नहीं छोड़ सकते हैं?

#include <map> 
#include <string> 
#include <iostream> 

int main() 
{ 
    const std::map< int, std::string > mapping = { 
     1, "ONE", 
     2, "TWO", 
    }; 

    const auto it = mapping.find(1); 
    if (mapping.end() != it) 
    { 
    std::cout << it->second << std::endl; 
    } 
    else 
    { 
    std::cout << "not found!" << std::endl; 
    } 
} 

और संकलन अगले त्रुटि संदेश (छ ++ 4.6.1) के साथ विफल:

gh.cpp:11:5: error: could not convert '{1, "ONE", 2, "TWO"}' from '<brace-enclosed initializer list>' to 'const std::map<int, std::basic_string<char> >' 

मुझे पता है कि यह कैसे तय करने के लिए:

const std::map< int, std::string > mapping = { 
     {1, "ONE"}, 
     {2, "TWO"}, 
    }; 

लेकिन संकलन शीर्ष उदाहरण में क्यों विफल रहता है?

उत्तर

22

क्योंकि नक्शा एक गैर-योग है, और इसमें गैर-कुल तत्व (std::pair<key_type, mapped_type>) शामिल हैं, इसलिए इसे प्रत्येक जोड़ी के लिए प्रारंभकर्ता-सूचियों से भरा प्रारंभकर्ता-सूची की आवश्यकता होती है।

std::pair<int,int> p0{ 1,2 }; // single pair 
std::map<int, int> m { { 1,2 } }; // map with one element 
std::map<int, int> m { { 1,2 }, { 3,4} }; // map with two elements 

ध्यान रखें कि ब्रेस एलिशन के नियम योग पर लागू होते हैं, इसलिए वे यहां लागू नहीं होते हैं।

+0

'std :: pair' एक कुल है, इसलिए इसे अपनी प्रारंभिक सूची की आवश्यकता नहीं है (जैसा कि इसे [मेरे द्वारा लिंक किए गए उत्तर] में बताया गया है (http://stackoverflow.com/a/ 11735045/476681) या, क्या मैं गलत हूं? –

+3

@ BЈовић वास्तव में, 'std :: pair' कुल नहीं है। मुझे नियमों को नहीं पता कि '{}' छोड़ा जा सकता है *, लेकिन इस मामले में इसे अनुमति देने के लिए यह समझ में नहीं आता है। मैं बाद में और अधिक कहने में सक्षम हो सकता हूं ... – juanchopanza

+1

@ BЈовић §8.5 पर देखकर, मुझे लगता है कि कारण यह है कि ब्रेस एलिजन केवल कुल प्रकार के लिए अनुमति है। – juanchopanza

3

सी ++ करने के बाद से काफी समय बीत गया, लेकिन मेरा अनुमान होगा क्योंकि std::map अलग-अलग ऑब्जेक्ट्स का एक सेट होने की उम्मीद कर रहा है, प्रत्येक ऑब्जेक्ट में एक कुंजी और एक मूल्य जोड़ी है।

व्यक्तिगत वस्तुओं की एक सूची होने पर समझ में नहीं आता है, और यह भी पढ़ना मुश्किल है (यह सुनिश्चित करने के लिए कि आपके पास कई आइटम हैं जो वास्तव में दो से विभाजित हैं)।

8

सी ++ 11 मानक की अनुमति देता है elided जा करने के लिए ब्रेसिज़ केवल जब लक्ष्य एक समग्र है:

8.5.1 समुच्चय [dcl.init.aggr]

एक कुल है किसी सरणी या एक क्लास (क्लॉज 9) जिसमें उपयोगकर्ता द्वारा प्रदत्त कन्स्ट्रक्टर (12.1), गैर-स्थिर डेटा सदस्यों (9.2) के लिए कोई ब्रेस-या-बराबर-प्रारंभकर्ता नहीं है, कोई निजी या संरक्षित गैर स्थैतिक डेटा सदस्य (क्लॉज 11) , कोई आधार वर्ग (क्लॉज 10), और कोई वर्चुअल फ़ंक्शन (10.3) नहीं।

...

(अनुच्छेद 11)

रूप

T x = { a }; 

ब्रेसिज़ एक प्रारंभकर्ता-सूची में elided किया जा सकता है इस प्रकार की घोषणा की। यदि प्रारंभकर्ता-सूची बाएं ब्रेस के साथ शुरू होती है, तो शुरुआती प्रारंभकर्ता-खंडों की अल्पविराम से अलग सूची के सदस्यों को एक उप-योग शुरू करती है; सदस्यों के मुकाबले अधिक आरंभकर्ता-खंड होने के लिए यह गलत है। यदि, हालांकि, उप-योग के लिए प्रारंभकर्ता-सूची बाएं ब्रेस से शुरू नहीं होती है, तो केवल सूची से पर्याप्त प्रारंभकर्ता-खंडों को उपसमूह के सदस्यों को प्रारंभ करने के लिए लिया जाता है; किसी भी शेष प्रारंभकर्ता-खंड हैं जो कुल वर्तमान उपसमूह के सदस्य के अगले सदस्य को प्रारंभ करने के लिए बाएं हैं।

+0

'std :: जोड़ी 'एक कुल है, या क्या मैं गलत हूं? –

+2

@ BЈовић गलत, यह कुल नहीं है। इसमें रचनाकार और सभी हैं। – juanchopanza

+1

@ BЈовић: मैंने सोचा था कि सवाल 'std :: map' के बारे में था, लेकिन neithe आर 'जोड़ी' या 'मानचित्र' समेकित हैं (उनके पास उपयोगकर्ता द्वारा प्रदत्त कन्स्ट्रक्टर हैं)। –

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

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