2010-09-08 14 views
6

के स्थिर सदस्यों को आरंभ करना मैं यह पता लगाने की कोशिश कर रहा हूं कि यह उदाहरण संकलित क्यों नहीं होता है। मेरी समझ यह है कि यदि एक स्थैतिक चर स्पष्ट रूप से सेट नहीं किया गया है तो यह 0 पर डिफ़ॉल्ट हो जाता है। उनमें से चार उदाहरण नीचे दिए गए पांच उदाहरणों में व्यवहार करते हैं, लेकिन जिस पर टिप्पणी की गई है वह संकलित नहीं होगी।एक टेम्पलेटेड क्लास

#include <iostream> 
class Foo 
{ 
public: 
    static int i; 
    static int j; 
}; 
template <int n> 
class Bar 
{ 
public: 
    Bar(int) { } 
    static int i; 
}; 

static int i; 
int Foo::i; 
int Foo::j = 1; 
template <> int Bar<2>::i; 
template <> int Bar<3>::i = 3; 

int main(int argc, char** argv) 
{ 
    std::cout << "i   " << i << std::endl; 
    std::cout << "Foo::i " << Foo::i << std::endl; 
    std::cout << "Foo::j " << Foo::j << std::endl; 
    //std::cout << "Bar<2>::i " << Bar<2>::i << std::endl; // Doesn't compile? 
    std::cout << "Bar<3>::i " << Bar<3>::i << std::endl; 
    return 0; 
} 

क्यों int Bar<2>::iint Foo::i या static int i के रूप में एक ही बात नहीं करता है?

संपादित करें: मैं बार <> बार < 2> और बार < 3> घोषणाओं में टेम्पलेट जोड़ने के लिए भूल गया था। स्टैंडर्ड सी के नवीनतम मसौदे के अनुसार (समस्या का समाधान नहीं करता है, हालांकि, अभी भी लिंकर त्रुटियों हो रही)

+3

[विशेष टेम्पलेट वर्ग के लिए स्थिर सदस्य प्रारंभिकरण] का डुप्लिकेट (http://stackoverflow.com/questions/2342550/static-member-initialization-for- विशेषीकृत- टेम्पलेट- क्लास)। –

+0

लिंकिंग त्रुटि क्या है? – Chubsdad

+0

@Chubsdad: निस्संदेह यह है कि "बार <2> :: i'" या इसका अर्थ कुछ है। ओपी के कोड में, 'टेम्पलेट <> int बार <2> :: i; '_nondefining_ घोषणा है (litb के विस्तृत स्पष्टीकरण के लिए लिंक किए गए डुप्लिकेट देखें)। –

उत्तर

5

वर्तमान सी ++ मानक के नियमों के तहत, विशेषज्ञता template <> int Bar<2>::i; केवल एक घोषणा है और कभी परिभाषा नहीं है। परिभाषा बनने के लिए, आपको प्रारंभिक निर्दिष्ट करना होगा। (खंड देखें 14.7.3/15)

इसके अलावा, आप एक बहुत ही आम मामले लापता गया:

template <int n> int Bar<n>::i; 

इस के लिए एक परिभाषा प्रदान करता है: एक टेम्पलेट का एक गैर-विशेष स्थिर सदस्य की परिभाषा Bar<N>::i एन के बराबर 2 या 3.

1

++ यह कहता है

14.7.3/13 एक टेम्पलेट की एक स्थिर डेटा सदस्य का एक स्पष्ट विशेषज्ञता एक है परिभाषा अगर घोषणा में प्रारंभकर्ता शामिल है; अन्यथा, यह एक घोषणा है।
[ध्यान दें: एक टेम्पलेट की एक स्थिर डेटा सदस्य की परिभाषा है कि डिफ़ॉल्ट प्रारंभ आवश्यकता है एक braced-init-सूची का उपयोग करना चाहिए:

template<> X Q<int>::x;  //declaration 
template<> X Q<int>::x(); // error: declares a function 
template<> X Q<int>::x { }; // definition 

- अंत टिप्पणी]

तो क्या आप कह रहे हैं संभव है , यदि आपका कंपाइलर इसका समर्थन कर रहा है।

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