2010-07-22 13 views
6

में स्टेटिक कॉन्स सदस्य प्रारंभिकता मुझे 'स्थिर कॉन्स' सदस्य प्रारंभिकरण के बारे में कोई समस्या है। एक templated कक्षा में मैं एक कॉन्स सदस्य परिभाषित करता हूं और कक्षा के बाहर इसे शुरू करता हूं।
जब मैं .h फ़ाइल शामिल करता हूं जहां यह वर्ग एकाधिक .cpp फ़ाइलों में कार्यान्वित किया जाता है, तो मुझे LNK2005 त्रुटि (मैं VS2010 का उपयोग कर रहा हूं) जो कहता है कि स्थिरता पहले से ही परिभाषित है।टेम्पलेटेड क्लास

// List.hpp 
template <class T> 
class List { 
    static const double TRIM_THRESHOLD; 
}; 

template <class T> 
const double List<T>::TRIM_THRESHOLD = 0.8; 

मैं एक .cpp फ़ाइल में सदस्य प्रारंभ डालने की कोशिश की, लेकिन फिर मैं कह रही है कि लगातार सब पर परिभाषित नहीं है एक लिंकर त्रुटि मिलती है। यदि सूची templated नहीं है और मैं एक .cpp फ़ाइल में प्रारंभिक डाल दिया, सब ठीक है।
क्या इस स्थिति के लिए कोई समाधान है? मेरे पास पहले से फाइल के चारों ओर क्लॉज # ifdef/परिभाषित है, और यह निश्चित रूप से समाधान नहीं है।

+1

आप परिभाषा में 'कॉन्स्ट' संशोधक गायब हैं। – Ropez

+1

क्या आप वाकई अपना कोड चाहते हैं? आपको कोई त्रुटि नहीं मिलनी चाहिए। @ रोपेज़: 'कॉन्स्ट' केवल घोषणा में मायने रखता है। – GManNickG

+0

दिलचस्प बात यह है कि वीएस2015 में यह समस्या नहीं है। यह किसी भी तरह से अनुकूलित/समझ सकता है कि स्थिर कॉन्स परिभाषा वास्तव में एक ही चीज़ है और लिंकर में त्रुटि को ध्वजांकित नहीं करती है। – Menace

उत्तर

7

आपको एक स्रोत फ़ाइल में निरंतर परिभाषित करना चाहिए जो शीर्षलेख नहीं है (इसलिए यह केवल एक बार परिभाषित हो जाता है) क्योंकि यह एक टेम्पलेट है जिसे आपको शीर्षलेख में रखने की आवश्यकता है (और सभी उदाहरणों का एक ही मान है) आप एक का उपयोग कर सकते हैं सामान्य आधार वर्ग।

class ListBase { 
protected: 
    ListBase() {} // use only as base 
    ~ListBase() { } // prevent deletion from outside 
    static const double TRIM_THRESHOLD;  
}; 

template <class T> 
class List : ListBase { 
}; 

// in source file 
double ListBase::TRIM_THRESHOLD = 0.8; 

एक अन्य विकल्प के लिए एक स्थिर समारोह के रूप में यह है:

static double trim_threashold() { return 0.8; } 

संपादित करें: अपने संकलक सी ++ 11 का समर्थन करता है, तो आप एक constexpr function तो यह है कि अपने static विधि बनाने के सभी अनुकूलन अवसर हैं जो सीधे मूल्य का उपयोग कर रहे हैं।

+0

मुझे लगता है कि आपका बिंदु गलत है। Http://stackoverflow.com/questions/1553854/template-static-variable – cybevnm

+1

मुझे नहीं लगता कि वह गलत है, क्योंकि उसे विरासत का उपयोग किया जाता है, जहां स्थैतिक सदस्य पूर्वजों में होता है जो टेम्पलेट नहीं होता है। फिर स्थिर फ़ंक्शन का उपयोग भी मान्य है। – uray

+0

यदि हमें टेम्पलेट के प्रत्येक इंस्टेंटेशन के लिए एक ही स्थिर मूल्य की आवश्यकता है (TRIM_THRESHOLD सूची या सूची के लिए समान है) मोटी का समाधान सही है। अगर हमें केवल लिंकर त्रुटियों से बचने के लिए ऐसा करना है (एक ही सिंबल के एकाधिक निश्चित), तो यह समाधान अधिक है। भाषा हमें हेडर में टेम्पलेट वर्ग के स्थिर चर को परिभाषित करने की अनुमति देती है। अगर मोटी का पहला मामला था - मैं माफी माँगता हूं, क्योंकि मैं उसकी बात समझ नहीं पाया था। पूर्णता के लिए – cybevnm

संबंधित मुद्दे