2016-08-30 16 views
9

यहां कक्षा है कि कुछ struct के boost::circular_buffer होता है। मैं iterators के लिए circular_buffer निहित एक typedef बनाते हैं।std :: UPPER_BOUND स्थिरांक सदस्य समारोह में स्थिरांक इटरेटर रिटर्न

मेरे समस्या यह है: जब doWork समारोह const चिह्नित है, std::upper_bound के दिए गए मान वापसी मान boost::cb_details::const_traits होने की वजह से MyIterator प्रकार के साथ संगत नहीं है। अगर मैं समारोह से const कीवर्ड निकालने, मेरे सभी संकलन त्रुटियों चले जाओ।

स्पष्ट है संकलक त्रुटि यह है:

#include <algorithm> 
#include <boost/circular_buffer.hpp> 

template <typename T> 
class Wrapper { 
public: 
    struct Sample { 
     T foo; 
    }; 

    typedef typename boost::circular_buffer<Sample>::iterator MyIterator; 

    Wrapper(int size) { cb.resize(size); } 

    void add(T val) { cb.push_back(Sample{val}); } 

    void doWork(T bound) const { 
     MyIterator iter = 
      std::upper_bound(cb.begin(), cb.end(), Sample{3}, 
         [](const Sample& a, const Sample& b) { return a.foo < b.foo; }); 
    } 

    boost::circular_buffer<Sample> cb; 
}; 

int main() { 
    Wrapper<int> buf(100); 
    buf.add(1); 
    buf.add(5); 
    buf.doWork(3); 
    return 0; 
} 

तो, क्यों इस समारोह स्थिरांक नहीं कर सकते हैं:

error: conversion from ‘boost::cb_details::iterator<boost::circular_buffer<Wrapper<int>::Sample, std::allocator<Wrapper<int>::Sample> >, boost::cb_details::const_traits<std::allocator<Wrapper<int>::Sample> > >’ to non-scalar type ‘Wrapper<int>::MyIterator {aka boost::cb_details::iterator<boost::circular_buffer<Wrapper<int>::Sample, std::allocator<Wrapper<int>::Sample> >, boost::cb_details::nonconst_traits<std::allocator<Wrapper<int>::Sample> > >}’ requested  
          [](const Sample& a, const Sample& b) { return a.foo < b.foo; }); 

यहाँ एक आत्म निहित उदाहरण है? इसके आधार पर चिह्नित करने से इसका दुष्प्रभाव क्यों होता है? मैं कंटेनर में एक गैर स्थिरांक इटरेटर चाहते हैं, लेकिन मेरी असली परीक्षा मामले में मैं वास्तव में सब पर कंटेनर को संशोधित करने का इरादा नहीं है।

+4

खैर के बाद से '' doWork' const', 'cb' रूप में अच्छी तरह' const' के रूप में व्यवहार किया जाता है। चूंकि 'doWork'' cb' के बजाय 'const_iterator 'का उपयोग करने का इरादा नहीं रखता है। –

+2

एक एमसीवीई! आश्चर्य कभी नहीं रुकता है। +1 –

+1

@CaptainObvlious: उत्तर अनुभाग नीचे है, दोस्त –

उत्तर

7

आपको const_iterator की आवश्यकता होगी, क्योंकि आप प्रभावी रूप से const कंटेनर देख रहे हैं।

शायद:

typedef typename boost::circular_buffer<Sample>::const_iterator MyConstIterator; 

है & hellip; फिर इनमें से एक iter बनाएं।

कोई आपको यह बताने जा रहा है कि आप इसे auto से बचा सकते थे। यह सच है, लेकिन फिर तुम कभी नहीं इस "बग" की खोज की है होता है, या कि const_iterator रों मौजूद हैं।

+0

दरअसल अब मैं const_iterators समझते हैं, धन्यवाद! – Chris

4

यदि आपका फ़ंक्शन const चिह्नित है तो सदस्य चर के लिए आपकी सभी पहुंच const भी होगी।

const कंटेनर केवल const_ इटरेटर्स तक पहुंच की इजाजत देगा, यह वही तरीका है जो इटरेटर काम करते हैं।

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