जैसा कि नाम से पता चलता है, आपके द्वारा घोषित एक सिंबल को आपके द्वारा परिभाषित नहीं किया गया था। यह कई कारणों से हो सकता है। आइए उनमें से तीन को देखें –
आप घोषित नाम को परिभाषित करना भूल गए। उदाहरण के लिए, आपने एक फाइल में एक फंक्शन घोषित किया और कहीं उसका उपयोग किया। लेकिन आपने उसकी परिभाषा प्रदान नहीं की। कोड –
#include<iostream>
void foo();
int main() {
foo(); // घोषित लेकिन परिभाषित नहीं
}
आपने इसे परिभाषित किया लेकिन क्वालिफाइड नाम का उपयोग नहीं किया। मान लीजिए आपने एक मेथड के साथ एक क्लास बनाई और उस मेथड को परिभाषित किया लेकिन स्कोप रिज़ॉल्यूशन का उपयोग करके उस फंक्शन को उस परिभाषा से लिंक करना भूल गए और उस फंक्शन का कहीं उपयोग किया। उदाहरण के लिए,
#include<iostream>
class A {
void foo();
};
void foo() { } // A::foo का उपयोग करना चाहिए था
int main() {
A a;
a.foo(); // परिभाषित नहीं!
}
आपने निर्भरताओं को गलत क्रम में शामिल नहीं किया। लिंकर आपके द्वारा निर्दिष्ट क्रम में लिंक करने का प्रयास करता है। इसलिए यदि आप किसी मेथड का उपयोग उसकी परिभाषा से पहले करते हैं, तो यह त्रुटि देगा।
इस त्रुटि का कारण बनने वाली शर्तों की एक विस्तृत सूची बनाना संभव नहीं है। लेकिन आप इस पोस्ट को देख सकते हैं जिसमें संभावित कारणों की एक बहुत अच्छी क्यूरेटेड सूची है – StackOverflow।