मेरे पास यह कोड है जो count को std::string पुनरावर्तक के साथ कॉल करने का प्रयास करता है लेकिन यह संकलन त्रुटि के साथ विफल हो जाता है।

#include <iostream>
#include <algorithm>

int count(std::string::iterator iter, char ch)
{
    int n = 0;
    while (*iter == ch) {
        n++;
        iter++;
    }
    return n;
}

void search(std::string const& str, char ch)
{
    auto iter = std::find(str.begin(), str.end(), ch);
    
    if (iter != str.end()) {
        int n = count(iter, ch);
        std::cout << n << " consecutive '" << ch << "' found";
    } else {
        std::cout << "no char found";
    }
    
    std::cout << std::endl;
}

int main()
{
    std::string line;
    
    while (std::getline(std::cin, line)) {
        search(line, 'a');
    }
        
    return 0;
}

मुझे जो त्रुटि मिल रही है:

00.cpp: In function 'void search(const string&, char)':
00.cpp:19:31: error: no matching function for call to 'count(__gnu_cxx::__normal_iterator >&, char&)'

मुझे पता चला कि अगर मैं count फ़ंक्शन में पूर्ण प्रकार std::string::iterator को auto में बदल देता हूं और संकलक को उस प्रकार का अनुमान लगाने देता हूं जो अपेक्षित रूप से काम करेगा (या कम से कम मुझे लगता है कि यह काम करता है)। क्यों?

c++
2
user15223691 18 फरवरी 2021, 09:10
2
ध्यान दें कि एक बार जब आप कोड संकलित कर लेते हैं, तो count() में अभी भी अपरिभाषित व्यवहार रहेगा, यदि char गिनने के लिए स्ट्रिंग के अंत में है। एक बार iter स्ट्रिंग के end तक पहुंचने के बाद लूप लूपिंग को रोकना नहीं जानता है, जिसे संदर्भित नहीं किया जा सकता है।
 – 
Remy Lebeau
18 फरवरी 2021, 09:41

1 उत्तर

सबसे बढ़िया उत्तर

str को const के रूप में चिह्नित किया गया है, फिर उससे लिया गया पुनरावर्तक, यानी iter का प्रकार std::string::const_iterator है, जिसे परोक्ष रूप से std::string::iterator में परिवर्तित नहीं किया जा सकता है और count को पास कर दिया।

चूंकि count iter द्वारा बताए गए तत्व को संशोधित नहीं करेगा, आप count को const_iterator लेकर भी बना सकते हैं।

int count(std::string::const_iterator iter, char ch)
4
songyuanyao 18 फरवरी 2021, 09:21