मेरी समझ यह है कि C ++ एक स्थिर प्रकार के सदस्यों को वर्ग के अंदर परिभाषित करने की अनुमति देता है जब तक कि यह पूर्णांक प्रकार है।
फिर, निम्न कोड मुझे लिंकर त्रुटि क्यों देता है?
#include <algorithm>
#include <iostream>
class test
{
public:
static const int N = 10;
};
int main()
{
std::cout << test::N << "\n";
std::min(9, test::N);
}
मुझे जो त्रुटि मिलती है वह है:
test.cpp:(.text+0x130): undefined reference to `test::N'
collect2: ld returned 1 exit status
दिलचस्प बात यह है कि अगर मैं std :: min के लिए कॉल को कमेंट करता हूं, तो कोड संकलन और लिंक को ठीक करता है (भले ही परीक्षण :: N को पिछली पंक्ति में भी संदर्भित किया जाता है)।
किसी भी विचार के रूप में क्या हो रहा है?
मेरा कंपाइलर लिनक्स पर gcc 4.4 है।
char
, आप इसके बजाय इसे परिभाषित कर सकते हैं constexpr static const char &N = "n"[0];
। ध्यान दें &
। मुझे लगता है कि यह काम करता है क्योंकि शाब्दिक तार स्वचालित रूप से परिभाषित होते हैं। मैं इसके बारे में चिंतित हूं, हालांकि - यह विभिन्न अनुवाद इकाइयों के बीच एक हेडर फ़ाइल में अजीब व्यवहार कर सकता है, क्योंकि स्ट्रिंग संभवतः कई अलग-अलग पते पर होगी।
inline const int N = 10
, जो कि मेरे ज्ञान में अभी भी लिंकर द्वारा परिभाषित भंडारण कहीं है। क्लास इनफ़्लेमशन टेस्ट के अंदर स्टेटिक वेरिएबल परिभाषा प्रदान करने के लिए कीवर्ड इनलाइन का भी इस्तेमाल किया जा सकता है ।