C ++ में अतिरिक्त योग्यता त्रुटि


120

मेरे पास एक सदस्य फ़ंक्शन है जिसे निम्नानुसार परिभाषित किया गया है:

Value JSONDeserializer::ParseValue(TDR type, const json_string& valueString);

जब मैं स्रोत संकलित करता हूं, मुझे मिलता है:

त्रुटि: सदस्य 'ParseValue' पर अतिरिक्त योग्यता 'JSONDeserializer ::'

यह क्या है? मैं इस त्रुटि को कैसे दूर करूं?

जवाबों:


209

इसका कारण यह है कि आपके पास निम्न कोड है:

class JSONDeserializer
{
    Value JSONDeserializer::ParseValue(TDR type, const json_string& valueString);
};

यह मान्य नहीं है C ++ लेकिन Visual Studio इसे स्वीकार करता है। मानक कंपाइलर कंपाइलर के साथ इसे संकलित करने में सक्षम होने के लिए आपको इसे निम्न कोड में बदलने की आवश्यकता है (जीसीसी इस बिंदु पर मानक के अधिक अनुपालन है)।

class JSONDeserializer
{
    Value ParseValue(TDR type, const json_string& valueString);
};

त्रुटि इस तथ्य से आती है कि JSONDeserializer::ParseValueएक योग्य नाम (नेमस्पेस योग्यता वाला एक नाम) है, और इस तरह के नाम को एक वर्ग में विधि नाम के रूप में मना किया जाता है।


1
क्या विज़ुअल स्टूडियो को इस बारे में चेतावनी देने का कोई तरीका है?
अल्टानो

1
@altumano: नहीं, लेकिन Cppcheck ऐसा कर सकता है और पहचानकर्ताओं में गैर-ASCII वर्णों का भी पता लगाता है जो gcc को कोड को अधिक पोर्टेबल बनाए रखने में मदद करता है।
शार्पूथ

@ सदस्यता: धन्यवाद, कैपचेक वास्तव में उन त्रुटियों का पता लगा सकता है। Cppcheck के लिए एक विजुअल स्टूडियो प्लगइन भी है (लेकिन यह छोटी गाड़ी है और सभी फाइलों में पता नहीं लगा है)
altumano

3
@altumano: क्या यह बात github.com/VioletGiraffe/cppcheck-vs-addin है ? यदि ऐसा है तो आप बग की रिपोर्ट कर सकते हैं - यह परियोजना काफी जीवित है और अच्छा मौका है कि इसे ठीक किया जाएगा।
शार्प्यूट

भविष्य से नमस्ते। C4596 - docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/… को चेतावनी देकर आप MSVC को इस बारे में चेतावनी देने के लिए बाध्य कर सकते हैं । मैं कंपाइलर स्विच / वी 4596
लेन

19

इसका मतलब यह है कि एक वर्ग को एक फ़ंक्शन के साथ अनावश्यक रूप से उल्लेख किया गया है। हटाने का प्रयास करेंJSONDeserializer::


13

क्या आप इस लाइन को कक्षा की घोषणा के अंदर रख रहे हैं ? उस मामले में आपको हटा देना चाहिए JSONDeserializer::


6

पठनीयता / स्थिरता के लिए एक योग्य नोट:

आप JSONDeserializer::अपनी कार्यान्वयन फ़ाइल (*। Cpp) में परिभाषा के साथ क्वालीफ़ायर रख सकते हैं ।

जब तक आपके इन-क्लास डिक्लेरेशन (जैसा कि दूसरों द्वारा उल्लेख किया गया है) के पास क्वालीफायर नहीं है, जी ++ / जीसीसी अच्छा खेलेंगे।

उदाहरण के लिए:

MyFile.h में:

class JSONDeserializer
{
    Value ParseValue(TDR type, const json_string& valueString);
};

और myFile.cpp में:

Value JSONDeserializer::ParseValue(TDR type, const json_string& valueString)
{
    do_something(type, valueString);
}

जब myFile.cpp कई वर्गों से तरीकों को लागू करता है, तो यह जानने में मदद करता है कि कौन किसका है, सिर्फ परिभाषा को देखकर।


JSONDeserializer::cpp फ़ाइल के लिए (या सामान्य रूप में परिभाषा) की आवश्यकता है। अन्यथा, आपको एक अपरिभाषित संदर्भ मिलता है। coliru.stacked-crooked.com/a/8f8a0cd3f9db6c94 coliru.stacked-crooked.com/a/6cd1efe94c09d521
झो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.