एक वर्ग टेम्पलेट में स्थैतिक सदस्य आरंभीकरण


148

मैं यह करना चाहूंगा:

template <typename T>
struct S
{
    ...
    static double something_relevant = 1.5;
};

लेकिन मैं नहीं कर सकता क्योंकि something_relevantअभिन्न प्रकार का नहीं है। यह निर्भर नहीं करता है T, लेकिन मौजूदा कोड इस पर निर्भर करता है कि यह एक स्थिर सदस्य है S

चूंकि S टेम्पलेट है, मैं एक संकलित फ़ाइल के अंदर परिभाषा नहीं रख सकता। मैं इस समस्या का समाधान कैसे कर सकता हूं ?


std::stringटाइप करने के लिए भी लागू होता है
ट्रेवर बॉयड स्मिथ

C ++ 11 के बाद से कीवर्ड इनलाइन बदल गया है, ताकि स्थिर चर को घोषणा के बिंदु पर आरंभ किया जा सके। तो इसके लिए घोषणा "इनलाइन स्टैटिक डबल समथिंग_रेलेवेंट = 1.5;"

@ user8991265 मेरा मानना ​​है कि इनलाइन वैरिएबल C ++ 17 के बाद से उपलब्ध हैं, C ++ 11 नहीं।
zupazt3

जवाबों:


195

इसे हेडर में परिभाषित करें:

template <typename T>
struct S
{
    static double something_relevant;
};

template <typename T>
double S<T>::something_relevant = 1.5;

चूंकि यह एक टेम्पलेट का हिस्सा है, इसलिए सभी टेम्प्लेट के साथ कंपाइलर सुनिश्चित करेगा कि यह केवल एक बार परिभाषित हो।


4
@ एसबीआई: क्या यह एक परिभाषा नियम का उल्लंघन नहीं करता है?
अलेक्जेंड्रे सी।

7
नहीं, नहीं अगर हम टेम्पलेट की बात कर रहे हैं। अन्यथा फ़ंक्शन टेम्पलेट भी ऐसा करेंगे।
sbi

1
@sbi, @Prasoon: वास्तव में प्रसून प्रथम लगते हैं। लेकिन मैं अभी भी SDR को ODR (जो मेरी प्राथमिक चिंता थी) के बारे में टिप्पणी के कारण स्वीकार करता हूं।
अलेक्जेंड्रे सी।

1
@sbi सिर्फ पाठ पर मंडराता है :)
जोहान्स शाउब - लिट

5
@ जोहान्स: दमित, मैं यहाँ एक साल से हूँ और मुझे नहीं पता था कि! मैं और क्या भुल रहा हूं? (मुझे अब भी शर्म की बात याद है जब मुझे पता चला कि जब मैं वोटों की संख्या पर क्लिक करता हूं तो जो दो नंबर दिखाई देते हैं वे बग नहीं हैं, लेकिन एक सुविधा है।) <goes_playing>वाह, जब मैं आपके नाम पर मंडराता हूं, तो मुझे आपका प्रतिनिधि दिखाई देता है! मुझे नहीं पता था कि एक या तो। @Prasoon: नहीं, आप सही कह रहे हैं, मैं पुनरावृत्ति से वहां पहुंचा हूं जहां अब यह है। (इसीलिए मैंने आपका जवाब दिया, BTW।)
sbi

37

C ++ 17 के बाद से, अब आप स्थैतिक सदस्य की घोषणा कर सकते हैं inline, जो वर्ग परिभाषा में चर को परिभाषित करेगा:

template <typename T>
struct S
{
    ...
    static inline double something_relevant = 1.5;
};

लाइव: https://godbolt.org/g/bgSw1u


1
यह एक उत्कृष्ट उत्तर है। छोटा और सटीक। अधिक जानकारी के लिए en.cppreference.com/w/cpp/language/static#Static_data_members देखें ।
andreee

31

यह काम करेगा

template <typename T>
 struct S
 {

     static double something_relevant;
 };

 template<typename T>
 double S<T>::something_relevant=1.5;

मैंने template<typename T> double S<T>::something_relevant=1.5;)कुछ_प्रवृत्त चर को परिभाषित नहीं किया (मैंने कंपाइलर थ्रोइंग एरर निकाल दिया है। क्या आप मुझे बता सकते हैं कि इसका क्या कारण है?
Goodman
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.