c++ - एक अजीब सी++ त्रुटि: test.cpp: 15: त्रुटि: '' const*'को' 'के' यह 'तर्क के रूप में'*'डिस्क्वार्ड क्वालिफायर




compiler-errors (4)

मुझे किसी विशेष प्रकार के कोड के साथ परेशानी हो रही है, अगर कोई मुझे इस बात पर प्रकाश डाल सकता है, तो उसे बहुत सराहना की जाएगी, मैंने निम्न नमूने में समस्या को अलग कर दिया है:

#include <iostream>

using namespace std;

class testing{
   int test();
   int test1(const testing& test2);
};

int testing::test(){
   return 1;
}

int testing::test1(const testing& test2){
   test2.test();
   return 1;
}

तो संभवतः निम्न त्रुटि का कारण क्या हो सकता है:

test.cpp: 15: त्रुटि: 'कॉन्स्ट टेस्टिंग' को 'इंट टेस्टिंग :: टेस्ट ()' के 'यह' तर्क के रूप में गुजरता है।

आपका बहुत बहुत धन्यवाद!


परीक्षण :: परीक्षण 1 (कॉन्स्ट टेस्टिंग और टेस्ट 2) को संकुचित ऑब्जेक्ट को कॉन्स्ट होने की उम्मीद है, और यदि आप इसके वैरिएबल के वैल्यू को संशोधित करते हैं, या उन तरीकों में से किसी भी तरीके का उपयोग करते हैं, जिन्हें स्पष्ट रूप से const नहीं कहा जाता है

चूंकि परीक्षण () पद्धति वास्तव में किसी भी डेटा को बदल नहींती है, सबसे अच्छा अभ्यास यह निर्धारित करने के लिए है, जैसा कि निम्न है:

class testing{
   int test() const;
   int test1(const testing& test2);
};

int testing::test() const {
   return 1;
}

वैकल्पिक रूप से, test1 () के लिए तर्कों को परिभाषित करते समय शब्द const को हटा दें, और यह आपको आपके अवकाश में किसी भी पारित ऑब्जेक्ट के तरीकों तक पहुंचने की अनुमति देगा।


लाइन: test2.test ()

एक गैर कॉन्सेबल फ़ंक्शन बुला रहा है, भले ही test2 एक const संदर्भ है। यही समस्या है। आप परीक्षण करके इसे ठीक कर सकते हैं: एक कॉन्स्ट फ़ंक्शन का परीक्षण करें


समस्या एक गैर ऑब्जेक्ट test2 पर testing::test1 पर एक गैर- const फ़ंक्शन test2.test() को बुला रही है

testing::test1 को test2 को पैरामीटर const testing &test2 रूप में मिलता है तो testing::test1 भीतर testing::test1 , test2const । फिर फ़ंक्शन की पहली पंक्ति में:

test2.test()

testing::test समारोह test2 पर कहा जाता है उस फ़ंक्शन को हस्ताक्षर के अंत में const साथ घोषित नहीं किया जाता है, इसलिए वह उस ऑब्जेक्ट को संशोधित कर सकता है जिस पर इसे कहा जाता है ( this सूचक को this पर पूरी तरह से पारित किया गया है), और यद्यपि यह नहीं है, संकलक ऐसा मानता है। आपको इसे वहां कॉल करने से, संकलक आपको एक स्पष्ट const बिना एक const चर को संशोधित करने देगा, जो सी ++ की अनुमति नहीं है। इसलिए त्रुटि संदेश की व्याख्या करने के लिए :

test.cpp:15: error: passing const testing as this argument of int testing::test()’ discards qualifiers

this वस्तु को संदर्भित करती है कि सदस्य कार्य ( testing::test ) चल रही है, और इस मामले में यह const नहीं है, क्योंकि testing::test const साथ घोषित नहीं किया गया था, और इस प्रकार बेमेल पता चला है जब गैर- const पॉइंटर ( this ) const ऑब्जेक्ट ( testing ) को देखें, const क्वॉलिफायर को अनदेखा कर।

इसका समाधान करने के लिए , यह तय करें कि testing::test फ़ंक्शन को कभी भी उस ऑब्जेक्ट को संशोधित करने की आवश्यकता होनी चाहिए जिस पर इसे कहा जाता है (जिस तरह से अब लिखा गया है, ऐसा नहीं है, क्योंकि यह return 1 , हालांकि वह बदल सकता है, इसलिए आपको इसकी ज़रूरत है यह सोचने के लिए कि इसका उद्देश्य क्या है)। यदि ऐसा होना चाहिए, तो स्पष्ट रूप से इसे const वस्तु पर बुला जाना बुरा है, हालांकि आप const_cast का उपयोग करने के लिए कम्पाइलर को ओवरराइड करने के लिए कह सकते हैं, लेकिन यह खतरनाक है अगर ऐसा नहीं होना चाहिए, तो उसे const , ताकि इसे const ऑब्जेक्ट्स पर भी बुलाया जा सके:

class testing{
    int test1() const;
    // ...
}

int testing::test() const {
    // ...
}

एक त्वरित और गंदगी समाधान के लिए, -fpermissive साथ संकलन का प्रयास करें जितनी बार संकलक खुद द्वारा सुझाया जाता है (जो संभवतया VisualStudio compilers क्या करते हैं, कि Windows उपयोगकर्ताओं को शायद ही इस समस्या की रिपोर्ट करते हैं)।







const