2013-06-25 9 views
6

मैं ऐसे दो typedefs आ रही हैं:एसटीएल iterators std :: दूरी() त्रुटि

typedef std::vector<int> Container; 
typedef std::vector<int>::const_iterator Iter; 

समस्या यह है कि मैं विचार में, मैं Container Input पर कुछ कार्रवाई करने, और उसके बाद मैं गणना करने के लिए std::distance(Input.begin(),itTarget) चाहते हैं , जहां itTargetIter प्रकार का है। लेकिन मुझे यह कंपाइलर त्रुटि मिल रही है कि no instance of function template "std::distance" matches the argument list, और केवल कास्टिंग के बाद, यानी, std::distance(static_cast<Iter>(Input.begin()),itTarget) सब कुछ ठीक काम करता है।

मुझे आश्चर्य है कि वह क्यों है?

+2

क्या ऐसा इसलिए है क्योंकि 'प्रारंभ() '' const_iterator' वापस नहीं कर रहा है? –

+0

लेकिन किसी भी तरह से यह सक्षम होना चाहिए? http://www.cplusplus.com/reference/vector/vector/begin/ –

+1

वैसे ही 'const' और non-'const' अधिभार काम करता है। केवल तभी 'इनपुट' 'const'-योग्य है 'const' अधिभार कहा जाएगा। इसके अलावा, इटरेटर को कास्टिंग करने के बजाए, आप टेम्पलेट प्रकार निर्दिष्ट कर सकते हैं: 'std :: distance (इनपुट.बेजिन(), itTarget)' –

उत्तर

8

std::distance एक टेम्पलेट फ़ंक्शन है, यह विभिन्न मानकों को स्वीकार नहीं कर सकता है। आप उपयोग करने की आवश्यकता:

std::distance(Input.cbegin(),itTarget); 
        ^^ 

देख std::vector::cbegin लिंक

+1

तीसरी बार आकर्षण: पी –

+0

और cbegin() कॉन्स इटरेटर देता है? –

+0

@ सिमोनरघली यूप, अपडेटेड लिंक – billz

5

Input.begin() रिटर्न एक const_iterator के बजाय एक iterator, और अपने दूसरा तर्क एक const_iterator है, इसलिए दो तर्क एक अलग तरह के मूल रूप से कर रहे हैं। यदि आपके पास C++ 11 सुविधाओं तक पहुंच है तो आप cbegin() का उपयोग कर सकते हैं।

यह ऐसा करने का एक दूसरा तरीका: हर इटरेटर काम

std::vector<int> myVector(100); 
std::vector<int>::iterator it = myVector.begin(); 
std::vector<int>::const_iterator cit = it; 

द्वारा एक const_iterator में परिवर्तनीय है आप समारोह में चीजों को पैक करने के लिए आप के लिए कुछ कास्ट जादू इस्तेमाल कर सकते हैं कॉल है, तो:

std::distance(((const Container*)&Input)->begin(), itTarget); 

यदि इनपुट स्थिर है, तो संकलक को प्रारंभ() के कॉन्स्ट-संस्करण का उपयोग करने के लिए मजबूर किया जाता है, जो एक const_iterator देता है।

+0

वेक्टर के इटरेटर्स के साथ एक कास्ट काम करता है क्योंकि वे सामान्य रूप से 'टी *' और 'कॉन्स्ट टी *' के लिए टाइपिफ़ होते हैं। यह कक्षाओं के पुनरावृत्तियों के साथ काम नहीं कर सकता है। – jrok

+0

स्क्रैच करें कि, 'इटरेटर' जैसा दिखता है हमेशा परिवर्तनीय होना चाहिए 'const_iterator'। – jrok

+0

परिवर्तनीय, हां। Castable? मैं यह सुनिश्चित नहीं होगा। मेरा जवाब अपडेट किया गया। – Marius

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