यहां कक्षा है कि कुछ 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; });
यहाँ एक आत्म निहित उदाहरण है? इसके आधार पर चिह्नित करने से इसका दुष्प्रभाव क्यों होता है? मैं कंटेनर में एक गैर स्थिरांक इटरेटर चाहते हैं, लेकिन मेरी असली परीक्षा मामले में मैं वास्तव में सब पर कंटेनर को संशोधित करने का इरादा नहीं है।
खैर के बाद से '' doWork' const', 'cb' रूप में अच्छी तरह' const' के रूप में व्यवहार किया जाता है। चूंकि 'doWork'' cb' के बजाय 'const_iterator 'का उपयोग करने का इरादा नहीं रखता है। –
एक एमसीवीई! आश्चर्य कभी नहीं रुकता है। +1 –
@CaptainObvlious: उत्तर अनुभाग नीचे है, दोस्त –