2010-04-13 12 views
8
void main() 
{ 
    typedef boost::ptr_map<int, char> MyMap; 
    //typedef std::map<int, char *> MyMap; // in contrast with std type it works 

    MyMap mymap; 

    mymap[1] = new char('a'); 
    mymap[2] = new char('b'); 
    mymap[3] = new char('c'); 

    BOOST_FOREACH(MyMap::value_type value, mymap) 
    { 
    std::cout << value.first << " " << value.second << std::endl; 
    } 

    MyMap const & const_mymap = mymap; 

    BOOST_FOREACH(const MyMap::value_type value, const_mymap) 
    { 
    std::cout << value.first << " " << value.second << std::endl; 
    } 
} 

निम्न त्रुटि संदेश दूसरा BOOST_FOREACHक्यों BOOST_FOREACH कॉन्स बूस्ट :: ptr_map को संभाल नहीं सकता है?

error: conversion from 'boost::ptr_container_detail::ref_pair<int, const char* const>' to non-scalar type 'boost::ptr_container_detail::ref_pair<int, char* const>' requested 

मुझे लगता है कि इस सूचक कंटेनर की ref_pair की कमजोरी है ...

उत्तर

5

this answer के आधार पर पर जीसीसी से आता है, यह आप की तरह लग रहा 'री राइट। लेकिन एक कामकाज है। इस पर अपना दूसरा पाश बदलें:

BOOST_FOREACH(MyMap::const_iterator::value_type value, const_mymap) 
{ 
    std::cout << value.first << " " << value.second << std::endl; 
} 
1

टाइपिंगफिंग नक्शा का उपयोग करते समय भी भ्रमित है। इसके बजाय एक tuple का उपयोग करने के लिए यह बहुत आसान (और अधिक पढ़ने योग्य) है। यहाँ कैसे आप एक टपल का उपयोग कर सकते है:

int key; 
char* value; 
BOOST_FOREACH(boost::tie(key, value), mymap) 
{ 
    std::cout << key << " " << value << std::endl; 
} 

इसके अलावा, आप value.first और value.second के बजाय और अधिक सार्थक नाम दे सकते हैं।

+0

मुझे यह पसंद आया जब तक कि मैं लाइब्रेरी को और जानने के लिए नहीं गया ... "" टायर टुपल्स हैं, जहां सभी तत्व गैर-कॉन्स्ट संदर्भ प्रकार हैं। "प्रश्न विशेष रूप से 'कॉन्स्ट' संदर्भों के बारे में है। – Dennis

+0

यह अभी भी कॉन्स्ट मैप्स के साथ काम करेगा। गैर-कॉन्स्ट संदर्भ स्थानीय चर के लिए बाध्य है जो मानचित्र के तत्वों के लिए नहीं है। –

+0

इसे फिर से देखेंगे। चीयर्स। – Dennis

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