tutorial - the c++ programming language




त्रुटि: xxx को क्वालिफायर क्वालिफायर के 'इस' तर्क के रूप में xxx पास करना (2)

दरअसल सी ++ मानक (यानी सी ++ 0 एक्स ड्राफ्ट ) कहता है (टीएनएक्स @ एक्सईओ और @ बेन वोगेट ने मुझे इंगित करने के लिए कहा है:

23.2.4 एसोसिएटिव कंटेनर
5 सेट और मल्टीसेट के लिए मान प्रकार कुंजी प्रकार के समान है। मानचित्र और मल्टीमैप के लिए यह जोड़ी के बराबर है। एक सहयोगी कंटेनर में कुंजी अपरिवर्तनीय हैं।
एक सहयोगी कंटेनर के 6 पुनरावर्तक द्विपक्षीय इटरेटर श्रेणी का है। सहयोगी कंटेनरों के लिए जहां मान प्रकार कुंजी प्रकार के समान होता है, दोनों इटरेटर और const_iterator निरंतर iterators हैं। यह निर्दिष्ट नहीं है कि क्या इटरेटर और const_iterator एक ही प्रकार के हैं।

तो वीसी ++ 2008 डिनक्यूमवेयर कार्यान्वयन दोषपूर्ण है।

पुराना उत्तर:

आपको वह त्रुटि मिली है क्योंकि std lib के कुछ कार्यान्वयन में set::iterator set::const_iterator जैसा ही है।

उदाहरण के लिए libstdc ++ (g ++ के साथ भेज दिया गया) इसमें है (संपूर्ण स्रोत कोड के लिए here देखें):

typedef typename _Rep_type::const_iterator            iterator;
typedef typename _Rep_type::const_iterator            const_iterator;

और एसजीआई के docs यह कहता है:

iterator       Container  Iterator used to iterate through a set.
const_iterator Container  Const iterator used to iterate through a set. (Iterator and const_iterator are the same type.)

दूसरी तरफ वीसी ++ 2008 एक्सप्रेस आपके कोड को संकलित किए बिना संकलित करता है कि आप set::iterator पर गैर कॉन्स्टेशन विधियों को कॉल कर रहे हैं।

#include <iostream>
#include <set>

using namespace std;

class StudentT {

public:
    int id;
    string name;
public:
    StudentT(int _id, string _name) : id(_id), name(_name) {
    }
    int getId() {
        return id;
    }
    string getName() {
        return name;
    }
};

inline bool operator< (StudentT s1, StudentT s2) {
    return  s1.getId() < s2.getId();
}

int main() {

    set<StudentT> st;
    StudentT s1(0, "Tom");
    StudentT s2(1, "Tim");
    st.insert(s1);
    st.insert(s2);
    set<StudentT> :: iterator itr;
    for (itr = st.begin(); itr != st.end(); itr++) {
        cout << itr->getId() << " " << itr->getName() << endl;
    }
    return 0;
}

पंक्ति में:

cout << itr->getId() << " " << itr->getName() << endl;

यह एक त्रुटि देता है कि:

../main.cpp:35: त्रुटि: 'छात्र छात्र' को 'int'T' getId () 'के' इस 'तर्क के रूप में गुजरने वाले क्वालीफायर

../main.cpp:35: त्रुटि: 'stst :: string'T' getName () 'क्वालिफायर को छोड़कर' इस 'तर्क के रूप में' कॉन्स्ट स्टूडेंट टी 'पास करना

इस कोड के साथ क्या गलत है? धन्यवाद!


सदस्य कार्य जो क्लास इंस्टेंस को संशोधित नहीं करते हैं उन्हें const रूप में घोषित किया जाना चाहिए:

int getId() const {
    return id;
}
string getName() const {
    return name;
}

जब भी आप "क्वालिफायर छोड़ देते हैं" देखते हैं, तो यह const या volatile बारे में बात कर रहा है।





c++